Как я могу заставить команду "найти" в OS X по умолчанию для текущего каталога?
Я являюсь тяжелым пользователем командной строки и широко использую команду find
в сценариях моей сборки. Однако в Mac OS X, когда я не концентрируюсь, я часто получаю вывод следующим образом:
$ find -name \*.plist
find: illegal option -- n
find: illegal option -- a
find: illegal option -- m
find: illegal option -- e
find: *.plist: No such file or directory
В принципе, я забыл добавить маленькую точку:
$ find . -name \*.plist
Поскольку BSD find
требует, чтобы путь и GNU find
не (он принимает текущий каталог, если вы его не укажете). Я часто использую Linux, Mac OS X и Cygwin в одно и то же время, поэтому мне очень полезно, чтобы все мои инструменты работали одинаково. Я попытался написать функцию bash find
, которая добавила "./", если я забуду, но я потерпел неудачу. Спасибо за вашу помощь.:)
Ответы
Ответ 1
Если вы не можете дисциплинировать использование find
"правильно", то почему бы не установить GNU find
(из findutils
) в каталог вашего PATH перед командой find
.
У меня был собственный личный вариант cp
, который бы копировал файлы в текущий каталог, если последний элемент в списке не был каталогом. Я сохранял это в своем личном каталоге bin
в течение многих лет, но в конечном итоге удалил его, потому что я больше не использовал эту функциональность. (Мой "cp.sh" был написан в 1987 году и дважды редактировался в 1990 и 1997 годах в рамках изменений в нотах системы управления версиями. Думаю, я удалил его в 1998 году. Основная проблема с script заключается в том, что cp file1 file2
является неоднозначным между копированием файла по другому и копированием двух файлов в текущий каталог.)
Рассмотрите возможность написания своей собственной обертки на find
:
#!/bin/sh
[ ! -d "$1" ] && set -- . "[email protected]"
exec /usr/bin/find "[email protected]"
Во второй строке говорится: "Если аргумент 1 не является каталогом, а затем отредактируйте аргументы командной строки, чтобы включить точку перед остальной частью команды. Это будет путать, если вы когда-либо печатаете:
~/bin/find /non-existent/directory -name '*.plist' -print
потому что несуществующий каталог не является каталогом, а script добавит точку в командной строке - вид причины, по которой я остановил использование моей частной команды cp
.
Ответ 2
Вместо этого установите GNU find.
$ brew install findutils
$ alias find=gfind
Да, это работает!
Ответ 3
Если вы должны называть его "найти", то вы хотите:
alias find=/usr/bin/find\ .
в вашем .profile или .bash_profile или.... Замените реальный путь (если нет /usr/bin/find ) на вашем Mac OSX. Введите полный путь, чтобы избежать циклов (bash обычно интерпретирует alias find=find
без проблем, но лучше быть уверенным).
Но лучше не называть псевдоним find
(findl, myfind и т.д.), потому что это станет привычкой и неприятностями для вас, если вы попробуете его в другой системе.
Ответ 4
find ./ -name "*.plist"
edit: хмм, я, возможно, неправильно понял вопрос! если вы были сумасшедшие, как насчет эмуляции его через оболочку script? я регулярно храню случайные скрипты утилиты в ~/.bin, и это первое, что есть в моем PATH. если у вас была подобная настройка, возможно, вы могли бы сделать что-то вроде: (untested!)
#!/bin/sh
# remapping find!
CMD=`echo $1 | cut -c 1`
if [ $CMD = '-' ]
then
# pwd search
/usr/bin/find ./ $*
else
# regular find
/usr/bin/find $*
fi
Ответ 5
Я бы предположил, что если вы пишете сценарии (которые, скорее всего, будут перенесены из одной системы в другую в будущем), вы должны попытаться использовать более конкретную форму команды, которая указывает "". вместо того, чтобы полагаться на значение по умолчанию. По той же причине я могу даже предложить писать сценарии sh
вместо того, чтобы полагаться на bash
, которые могут быть не установлены повсюду.
Ответ 6
Это, вероятно, не то, что вы хотите, а как насчет: alias find="find ."
или выберите новое имя (findl
для поиска локального?)
Ответ 7
Возможно, вы захотите запустить команды, найденные по этой ссылке: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os- Икс /
Это немного устарело, например, я обнаружил, что мне не нужно было добавлять много команд к моему пути вообще.
Это решает вашу проблему, findutils
вашей системе использовать утилиту поиска не-BSD из пакета findutils
, а также устанавливать другие инструменты, которые вам могут понадобиться.