Как я могу сделать команду «найти» в OS X по умолчанию для текущего каталога? - PullRequest
14 голосов
/ 12 октября 2008

Я большой пользователь командной строки и широко использую команду 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, которая добавила бы «./», если я забыл, но мне это не удалось. Спасибо за вашу помощь. :)

Ответы [ 7 ]

17 голосов
/ 21 февраля 2013

Вместо этого установите GNU find.

$ brew install findutils
$ alias find=gfind

Да, это работает!

11 голосов
/ 12 октября 2008

Если вы не можете дисциплинировать себя, чтобы использовать find 'правильно', то почему бы не установить GNU find (из findutils) в каталог в вашем PATH перед системной командой find.

Раньше у меня был свой собственный вариант cp, который копировал файлы в текущий каталог, если последний элемент в списке не был каталогом. Я много лет хранил это в своем личном каталоге bin, но в конце концов удалил его, потому что больше не использовал эту функциональность. (Мой «cp.sh» был написан в 1987 году и дважды редактировался, в 1990 и 1997 годах, как часть изменений в нотации системы контроля версий. Я думаю, что я удалил его около 1998 года. Основная проблема со сценарием заключается в том, что неоднозначно между копированием файла поверх другого и копированием двух файлов в текущий каталог.)

Подумайте над тем, чтобы написать свою собственную обертку для find:

#!/bin/sh
[ ! -d "$1" ] && set -- . "$@"
exec /usr/bin/find "$@"

Во второй строке написано: «если аргумент 1 не является каталогом, то отрегулируйте аргументы командной строки, добавив точку перед остальной частью команды. Это будет сбивать с толку, если вы введете:

~/bin/find /non-existent/directory -name '*.plist' -print

потому что несуществующий каталог не является каталогом, и сценарий добавит точку в командную строку - причина, по которой я перестал использовать свою личную команду cp.

6 голосов
/ 12 октября 2008

Если вы должны назвать это 'найти', то вы хотите:

alias find=/usr/bin/find\ .

в вашем .profile или .bash_profile или…. Замените реальный путь (если не / usr / bin / find) на вашем Mac OSX. Введите полный путь, чтобы избежать циклов (обычно bash интерпретирует alias find=find без проблем, но лучше быть уверенным).

Но лучше не называть псевдоним find (findl, myfind и т. Д.), Потому что он станет привычкой и проблемой для вас, если вы попробуете его в другой системе.

4 голосов
/ 12 октября 2008
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
2 голосов
/ 12 октября 2008

Я бы посоветовал вам, если вы пишете сценарии (которые с большей вероятностью будут перенесены из одной системы в другую в будущем), вам следует попытаться использовать более конкретную форму команды, которая задает " «. вместо того, чтобы полагаться на дефолт. По той же причине я мог бы даже предложить написать sh сценарии вместо того, чтобы полагаться на bash, который может быть установлен не везде.

1 голос
/ 16 сентября 2015

Возможно, вы захотите запустить команды, найденные по этой ссылке: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

Это немного устарело, например, я обнаружил, что мне вообще не нужно было добавлять много команд в мой путь.

Это решает вашу проблему, когда ваша система использует утилиту поиска не-BSD из пакета findutils, а также устанавливает другие инструменты, которые вам могут понадобиться.

1 голос
/ 12 октября 2008

Это, вероятно, не то, что вы хотите, а как насчет: alias find="find ."

или выберите новое имя (findl для поиска локального?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...