Невозможно понять синтаксис команды find - PullRequest
11 голосов
/ 22 марта 2009

Команда find, похоже, отличается от других команд Unix.

Почему в конце следующей команды есть пустые фигурные скобки и обратная вспышка?

find * -perm 777 -exec chmod 770 {} \;

Я нашел одну причину для фигурных скобок, но не для обратной вспышки.

фигурные скобки, по-видимому, для пути

То же, что и -exec, за исключением того, что `` {} '' заменено на столько путей, сколько возможно для каждого вызова утилита

Ответы [ 4 ]

16 голосов
/ 22 марта 2009

За командой -exec может следовать любое количество аргументов, составляющих команду, которая должна выполняться для каждого найденного файла. Должен быть какой-то способ идентифицировать последний аргумент. Это то, что \; делает. Обратите внимание, что после ключа -exec могут последовать другие действия:

find euler/ -iname "*.c*" -exec echo {} \; -or -iname "*.py" -exec echo {} \;

(Это находит все c-файлы и файлы python в каталоге euler.)

Причина, по которой exec не требует, чтобы полная команда находилась внутри кавычек, заключается в том, что в большинстве случаев для этого требуется экранирование большого количества кавычек внутри команды.

6 голосов
/ 18 октября 2014

Строка {} в find заменяется путем к текущему файлу.

Точка с запятой используется для завершения команды оболочки, вызванной утилитой find.

Его нужно экранировать или заключать в кавычки, чтобы он не интерпретировался оболочкой, поскольку ; является одним из специальных символов, используемых оболочкой (операторы списка).

См. Также: Почему обратная косая черта и точка с запятой требуются при использовании команды find -exec?

3 голосов
/ 22 марта 2009

(Экранированная) точка с запятой необходима для того, чтобы «find» мог определить, где заканчиваются аргументы программы exec'd (если есть), и начинаются дополнительные аргументы для «find».

2 голосов
/ 22 марта 2009

Я бы порекомендовал вам вместо этого сделать

find . -perm 777 -print0 | xargs -0 chmod 770

"xargs" говорит, что нужно взять результаты поиска и передать их 20 следующей команде.

...