Невозможно понять синтаксис команды find

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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