Для чего нужны символы {}
и \;
в этом наборе команд?
find . -name '*.clj' -exec grep -r resources {} \;
Для чего нужны символы {}
и \;
в этом наборе команд?
find . -name '*.clj' -exec grep -r resources {} \;
См. раздел поиск человека. (особенно часть о -exec
)
При использовании -exec
для запуска команды для каждого из найденных файлов {}
заменяется именем каждого найденного файла, а команда завершается \;
В вашем примере для всех файлов, найденных в текущем каталоге (.
), соответствующих имени *.clj
, будет запущена команда grep -r resources
(чтобы найти строку resources
, если она существует в каждом из этих файлов).
На самом деле это несколько избыточно, так как -r
предназначен для рекурсивного поиска подкаталогов, а find
уже делает это.
man find
, потому что это не похоже на часть команды find
, так же как расширение оболочки, канал или другой оператор перенаправления не является частью команды, рядом с которой он находится. Я предположил, что это какая-то магия синтаксиса оболочки, которую я не смог бы идентифицировать, не зная ее имени.
- person temporary_user_name; 16.05.2019
В find параметр -exec захватывает остальные параметры до ; (точка с запятой), которую нужно экранировать, отсюда и \;. В пределах этого интервала {} заменяется именем проверяемого файла.
Рассмотрим эту альтернативную команду, которую мне легче понять:
find . -name *.clj | xargs grep -r resources
Строка символов "{}" будет заменена текущим обрабатываемым файлом. Экранированная точка с запятой завершает аргумент команды для опции -exec.
Строка {}
в find
заменяется путем к текущему файлу.
Точка с запятой используется для завершения команды оболочки, вызванной утилитой find
.
Его нужно экранировать или заключить в кавычки, чтобы он не интерпретировался оболочкой, потому что ;
— это один из специальных символов, используемых оболочкой (операторы списка).
См. также: Почему обратная косая черта и точка с запятой требуются с опцией -exec команды find?