grep only подкаталоги, соответствующие шаблону

9

У меня есть дерево каталогов, состоящее из нескольких тысяч подкаталогов, но мне часто требуется grep только небольшого подмножества этих каталогов. Как я могу grepтолько те подкаталоги, которые соответствуют шаблону?

Например, предположим, у меня есть эти подкаталоги, в которые я хочу добавить grep:

...
...
...
/foo
/fooLib
/fooHandler
/fooGizmo
...
...
...

Эти ...данные выше , представляют тысячи других каталогов , я не хочу , чтобы Grep в.

Предположим, я ищу все случаи bar, если я делаю это:

grep -n --recursive bar *

Я бы нашел то, что искал, но во всех каталогах. Как я могу искать только в тех подкаталогах, которые соответствуют шаблону foo*?

Джон Диблинг
источник
Хотите искать только в /fooдрузьях? В /fooи /foo/barи /foo/bar/quxтак и так, но нет /wibble/foo? В /fooи , /wibble/fooно не /foo/bar? В /fooи /foo/barа, /wibble/fooа не /elsewhere?
Жиль "ТАК - перестань быть злым"

Ответы:

11

Вы можете использовать grep и найти комбинацию, как показано ниже:

find /{foo,fooLib,fooHandler,fooGizmo} -type f -exec grep -l "test" {} \;

Или вы можете использовать

find /foo* -type f -exec grep -l "test" {} \;

Или используя только grep

grep -R "test" /foo*
Рахул Патил
источник
Могу ли я сделать это без явного указания подкаталогов? Скорее, используя подстановочный знак, такой как foo*?
Джон Диблинг
@JohnDibling Да, я обновил именно то, что вы говорите :)
Рахул Патил
Последнее предложение ( grep -R "test" /foo*) - это именно то, что я сейчас делаю, поэтому я приму.
Джон Диблинг
Спасибо тебе за это. Я использую первый шаблон, но хотел бы понять несколько вещей об этом - например, что делают окончание {}и обратный слеш?
random_user_name
Это обеспечивает строки, соответствующие grep, но местоположение данных (файла, в котором они находятся) теряется. Есть ли способ сохранить это?
Jontia
0

попробуйте, grep foo* <other parts>например:grep foo* -name "book*"

harish.venkat
источник
Если я ищу все инстанции barво всех файлов в подкаталогах с названиями foo*, это должно быть так: grep --recursive bar ./foo*/*?
Джон Диблинг