Как я могу сделать команду «найти» в OS X по умолчанию текущим каталогом?
-
10-07-2019 - |
Вопрос
Я большой пользователь командной строки и широко использую команду 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
, в которую добавлено " ./" если я забыл, но я потерпел неудачу. Спасибо за вашу помощь. :) Р>
Решение
Если вы не можете научить себя правильно использовать find
«правильно», то почему бы не установить GNU find
(из findutils
) в каталог в вашей переменной PATH перед системной командой find
.
Раньше у меня был свой собственный вариант cp
, который копировал файлы в текущий каталог, если последний элемент в списке не был каталогом. Я хранил это в своем личном каталоге bin
в течение многих лет, но в конце концов удалил его, потому что больше не использовал эту функциональность. (Мой «cp.sh» был написан в 1987 году и дважды редактировался, в 1990 и 1997 годах, как часть изменений в примечаниях системы контроля версий. Я думаю, что я удалил его примерно в 1998 году. Основная проблема со сценарием заключается в том, что cp file1 file2
неоднозначно между копированием файла поверх другого и копированием двух файлов в текущий каталог.)
Попробуйте написать свою собственную обертку в find
:
#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"
Во второй строке написано " если аргумент 1 не является каталогом, то отрегулируйте аргументы командной строки, добавив точку перед остальной частью команды. Это будет сбивать с толку, если вы введете:
~/bin/find /non-existent/directory -name '*.plist' -print
потому что несуществующий каталог не является каталогом, и скрипт добавит точку в командную строку - причина, по которой я перестал использовать свою частную команду cp
.
Другие советы
Вместо этого установите GNU find.
$ brew install findutils
$ alias find=gfind
Да, это работает!
Если вы должны назвать это «найти», то вы хотите:
alias find=/usr/bin/find\ .
в вашем .profile или .bash_profile или…. Замените реальный путь (если не / usr / bin / find) на вашем Mac OSX. Введите полный путь, чтобы избежать циклов (обычно bash интерпретирует alias find = find
без проблем, но лучше быть уверенным).
Но лучше не называть псевдоним find
(findl, myfind и т. д.), потому что это станет привычкой и проблемой для вас, если вы попробуете его в другой системе.
find ./ -name "*.plist"
edit : хм, возможно, я неправильно понял вопрос! если вы сошли с ума, как насчет эмуляции с помощью сценария оболочки? я обычно храню случайные служебные скрипты в ~ / .bin, и это первое, что есть в моем PATH. если бы у вас была похожая настройка, возможно, вы могли бы сделать что-то вроде: (не проверено!)
#!/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
Я бы посоветовал вам, если вы пишете сценарии (которые с большей вероятностью будут перенесены из одной системы в другую в будущем), вам следует попытаться использовать более конкретную форму команды, в которой указывается " ;. & Quot; вместо того, чтобы полагаться на дефолт. По той же причине я мог бы даже предложить написать сценарии sh
вместо того, чтобы полагаться на bash
, который может быть установлен не везде.
Вероятно, это не то, что вам нужно, а как насчет: alias find = " find. "
или выберите новое имя ( findl
для поиска локального?)
Возможно, вы захотите запустить команды, найденные по этой ссылке: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools- в-Mac-OS-X / р>
Это немного устарело, например, я обнаружил, что мне вообще не нужно было добавлять много команд к моему пути.
Это решает вашу проблему, поскольку ваша система использует утилиту поиска не-BSD из пакета findutils
, а также устанавливает другие инструменты, которые вам могут понадобиться.