2008-10-11 6 views
14

Я тяжелый пользователь командной строки и широко использую команду find в своих сценариях системы сборки. Однако на Mac OS X, когда я не концентрируясь я часто получаю вывода, как это:Как я могу заставить команду «найти» в 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, которая добавила «./», если бы я забыл, но я потерпел неудачу. Спасибо за вашу помощь. :)

ответ

10

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

У меня был свой личный вариант cp, который скопировал бы файлы в текущий каталог, если последний элемент в списке не был каталогом. Я сохранял это в своем личном каталоге bin в течение многих лет, но в конечном итоге удалил его, потому что я больше не использовал эту функциональность. (My 'cp.sh' был написан в 1987 году и дважды редактировался в 1990 и 1997 годах как часть изменений в нотах системы управления версиями. Думаю, я удалил его в 1998 году. Основная проблема со сценарием заключается в том, что 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 

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

4
find ./ -name "*.plist" 

редактировать: хмм, я, возможно, не понял вопрос! если вы были сумасшедшими, как насчет эмуляции его с помощью сценария оболочки? Я регулярно храню случайные скрипты утилиты в ~/.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 
+0

Отлично :) Спасибо. Хотя это не совсем совершенна, как она не работает: $ найти Какой должна получить преобразуется в: $ найти ./ – mxcl 2008-10-11 23:56:43

1

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

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

+0

Я собирался предложить псевдоним, но потом понял, что это не будет работать хорошо, если вам * хотел * указать путь в командной строке поиска. – 2008-10-11 22:18:47

+0

Он будет искать локальный каталог и указанный вами путь. find не ограничивается одним аргументом пути. – tzot 2008-10-11 22:44:16

+0

Хотя, если я укажу путь, я, вероятно, не хочу, чтобы он также искал текущий каталог. – mxcl 2008-10-12 00:31:44

2

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

+0

Это хороший момент. Действительно, я должен добавить скрипт/функцию на других платформах, которые вызывают команду find, если я не укажу путь. Таким образом, я не буду начинать писать сценарии, которые могут ломаться для разных реализаций различных инструментов. – mxcl 2008-10-12 00:02:39

6

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

alias find=/usr/bin/find\ . 

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

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

17

Установите вместо этого GNU.

$ brew install findutils 
$ alias find=gfind 

Yay, it works!

0

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

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

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