Команда поиска Unix, что такое {} и \; за?

Для чего нужны символы {} и \; в этом наборе команд?

find . -name '*.clj' -exec grep -r resources {} \;

person Berlin Brown    schedule 15.01.2009    source источник
comment
Обратите внимание, что команда grep -r не требуется, если эти файлы .clj не являются папками. find по умолчанию является рекурсивным, поэтому grep не обязательно должен быть таким. (grep будет передаваться каждому файлу.) Вместо этого вы также можете использовать xargs, поскольку с вашей текущей командой вы не узнаете, из каких файлов вы получаете попадания.   -  person PEZ    schedule 15.01.2009


Ответы (5)


См. раздел поиск человека. (особенно часть о -exec)

При использовании -exec для запуска команды для каждого из найденных файлов {} заменяется именем каждого найденного файла, а команда завершается \;

В вашем примере для всех файлов, найденных в текущем каталоге (.), соответствующих имени *.clj, будет запущена команда grep -r resources (чтобы найти строку resources, если она существует в каждом из этих файлов).

На самом деле это несколько избыточно, так как -r предназначен для рекурсивного поиска подкаталогов, а find уже делает это.

person Adam Bellaire    schedule 15.01.2009
comment
Я не подумал заглянуть в man find, потому что это не похоже на часть команды find, так же как расширение оболочки, канал или другой оператор перенаправления не является частью команды, рядом с которой он находится. Я предположил, что это какая-то магия синтаксиса оболочки, которую я не смог бы идентифицировать, не зная ее имени. - person temporary_user_name; 16.05.2019

В find параметр -exec захватывает остальные параметры до ; (точка с запятой), которую нужно экранировать, отсюда и \;. В пределах этого интервала {} заменяется именем проверяемого файла.

person falstro    schedule 15.01.2009

Рассмотрим эту альтернативную команду, которую мне легче понять:

find . -name *.clj | xargs grep -r resources 
person paxos1977    schedule 16.01.2009
comment
Но у которого есть главный недостаток неправильной обработки файлов со встроенными пробелами и т.п. - person jlliagre; 18.10.2014

Строка символов "{}" будет заменена текущим обрабатываемым файлом. Экранированная точка с запятой завершает аргумент команды для опции -exec.

person David J. Liszewski    schedule 15.01.2009

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

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

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

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

person kenorb    schedule 18.10.2014