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