Для записи, вот подход, который я предпочитаю:
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 изначально выполнял исключение.