2009-03-22 2 views
10

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

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

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

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

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

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

+2

Скобки также позволяет выполнять команды, которые не ожидают (или требуется) имя файла, чтобы быть последним аргументом. Вы можете использовать фигурные скобки, чтобы вставлять имя файла везде, где хотите, даже в том случае, когда имя исполняемой программы выполняется! –

+0

Возможный дубликат [Простая команда unix, что такое {} и \; для] (http://stackoverflow.com/questions/447048/simple-unix-command-what-is-the-and-for) – kenorb

ответ

2

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

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

«xargs» говорит взять результаты находки и кормить его 20 в то время следующей команды.

+1

Двадцать за раз? Говорит кто? –

+0

человек xargs (версии 4.4.0) не упоминает число 20. Это поведение может быть выполнено, хотя, вызывая xargs с -n20. – Stephan202

+0

«20 в то время» было своего рода средним. Это действительно так много, поскольку, по его мнению, может поместиться в обычную командную строку, которая, по моему мнению, составляет 512 байтов в POSIX. –

16

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

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

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

3

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

6

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

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

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

Смотрите также: Why are the backslash and semicolon required with the find command's -exec option?

Смежные вопросы