Для записи, вот подход, который я предпочитаю:
grep pattern $(find . -type f ! -path './test/main.cpp')
Сохраняя grep
в начале команды, я думаю, что это немного более ясно - плюс это не отключает grep
цветовую подсветку. В некотором смысле, использование find
в подстановке команд - это просто способ расширения / замены (ограниченного) подмножества поиска файлов в grep
функциональности.
Для меня find -exec
синтаксис довольно загадочный. Одной из сложностей find -exec
является (иногда) необходимость экранирования различных символов (особенно если \;
используется в Bash). Просто для того, чтобы поместить вещи в привычный контекст, следующие две команды в основном эквивалентны:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Если вы хотите исключить подкаталоги , может потребоваться использовать подстановочный знак. Я не совсем понимаю схему здесь - поговорим о тайной :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Еще одно замечание по обобщению find
решений на основе сценариев для использования в сценариях : grep
командная строка должна включать параметр -H
/ --with-filename
. В противном случае это изменит форматирование выходных данных при условии, что в результатах поиска будет только одно имя файла find
. Это примечательно, потому что это не кажется необходимым, если использовать grep
собственный поиск файлов (с -r
опцией).
... Еще лучше включить /dev/null
первый файл для поиска. Это решает две проблемы:
- Это гарантирует, что если будет один файл для поиска, он
grep
будет думать, что их два, и использовать режим вывода нескольких файлов.
- Это гарантирует, что если нет файлов для поиска,
grep
будет думать, что есть один файл и не зависает в ожидании на стандартный ввод.
Итак, окончательный ответ:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir
). Вот почему я хотел бы, чтобы grep изначально выполнял исключение.