Как я могу сделать команду «найти» в OS X по умолчанию текущим каталогом?

StackOverflow https://stackoverflow.com/questions/194725

  •  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 , а также устанавливает другие инструменты, которые вам могут понадобиться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top