Может быть, вам нужно find -iname NAME -exec grep -inr PATTERN {} \+
:
➜ tree
.
├── b
│ ├── abc.txt
│ └── def.txt
└── c
├── abc.txt
├── def.txt
└── ghi.txt
2 directories, 5 files
➜ for f in {b,c}/*; do printf "$f -- "; cat $f; done
b/abc.txt -- patt1
b/def.txt -- patt2
c/abc.txt -- patt1
c/def.txt -- patt2
c/ghi.txt -- patt1
➜ find . -iname abc.txt -exec grep -inr PATT1 {} \+
./c/abc.txt:1:patt1
./b/abc.txt:1:patt1
Что здесь происходит?
find
находит все файлы с заданным именем (это глоб, а не регулярное выражение):-i
означает игнорировать регистр, -exec
запускает следующую команду (grep ...
) для найденных файлов (представленных {}
).
Обратите внимание на \+
, что означает пропуск всехнайденные файлы в один grep (используйте \;
, если вы хотите передать эти файлы каждому другому grep
- не будут отображаться имена файлов).
Как видите, patt1
находится вb/abc.txt
, c/abc.txt
и c/ghi.txt
, но последнее игнорируется find
(имя не совпадает) и grep
не будет работать с этим файлом.