Я работаю с определенной структурой, которая имеет модули с согласованными соглашениями об именах папок. Я хотел бы получить все файлы, содержащие частичную строку foo из каталога высокого уровня, но мне нужны результаты только из файлов с путем, содержащим каталог с именем Bar . Для уточнения: из корневого каталога проекта, как правило, есть четыре уровня подпапок, содержащих произвольное количество подпапок и текстовых файлов (все .php). Подкаталоги, в которых я хотел бы искать / из которых я хотел бы получить результаты, все содержат родительскую папку с именем Bar .

Заявлено относительно моего ограниченного опыта: я хотел бы команду, такую как grep -isrl 'foo' ./ и получать только результаты, такие как

./A/B/C/Bar/D/F/Some.php
./G/H/I/Bar/Some.php

и исключая

./A/B/C/Baz/D/F/Some.php
./G/H/I/Baz/Some.php

По сути, я предполагаю, что есть что-то вроде grep -isrl 'foo' ./*/Bar/*.php где * будет соответствовать нулю-многим подкаталогам.

1 ответ1

1

В одну сторону:

find <search path> -type d -name 'Bar' -exec grep -r foo {} +

(без GNU find заменить + на \;).

Этот способ сначала найдет каталоги с именем Bar а затем рекурсивно grep только в них.

Чтобы ограничить поиск файлами PHP:

find <search path> -type d -name 'Bar' -exec grep -r --include '*.php' foo {} +

Это также может быть сделано с помощью оболочки, но это зависит от того, какую оболочку вы используете (очевидно).

РЕДАКТИРОВАТЬ: Добавление примера Bash:

shopt -s globstar
grep -r test <search path>/**/Bar/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .