Ваш пример только распечатывает количество случаев на строку а не общее количество в файле. Если это - то, что Вы хотите, что-то вроде этого могло бы работать:
perl -nle '$c+=scalar(()=m/needle/g);END{print $c}'
Ну, универсальный случай, который работает с любой командой, которая пишет в stdout, должен использовать xargs
, который позволит Вам присоединить любое количество параметров командной строки в конец команды:
$ find … | xargs grep 'search'
Или встроить команду в Ваш grep
строка с обратными галочками или $()
, который выполнит команду и заменит ее выводом:
$ grep 'search' $(find …)
Обратите внимание, что эти команды не работают, если имена файлов содержат пробел или определенные другие “странные символы” (\'"
для xargs, \[*?
для $(find …)
).
Однако в конкретном случае find
способность выполнить программу на данных аргументах встроена:
$ find … -exec grep 'search' {} \;
Все между -exec
и ;
команда должна выполниться; {}
заменяется именем файла, найденным find
. Это выполнит отдельное grep
для каждого файла; с тех пор grep
может взять много имен файлов и искать их всех, можно измениться ;
кому: +
для сообщения находят для передачи всех имен файлов соответствия grep
сразу:
$ find … -exec grep 'search' {} \+
Некоторые версии grep
(например, на невстроенном Linux или BSD или Mac OS X), имеют a -r
опция сделать рекурсивный поиск. На OpenBSD использовать -R
(и существует нет --exclude
как в примере ниже). Это покрывает простые комбинации find
с grep
.
Если Ваша реализация не имеет -R
флаг, или если Вы хотите более необычные критерии соответствия файла, можно использовать -exec
основной из find
заставить его выполниться grep
. Некоторые более старые find
реализации не поддерживают -exec
… +
; в этих системах используйте a ;
вместо +
(это будет звонить grep
однажды на файл, таким образом, это будет медленнее, но иначе результатом будет то же). Отметьте /dev/null
обманите для порождения grep
показать имя файла, даже если это, оказывается, называют на единственном файле (GNU grep и FreeBSD/NetBSD/OSX grep имеют a -H
опция достигнуть того же эффекта).
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
. ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ. В то время как-exec +
очень эффективно, это не существует на всей версии находки. – Arcege 07.09.2011, 22:11-exec
, вместо, чемxargs
. Если Вы используете-exec
вfind
, это создаст только одну оболочку к grep для содержания. Если Вы используетеxargs
, это создаст две оболочки: один дляfind
и другой дляxargs
. – 18.01.2012, 20:32$ find … -exec grep 'search' {} \+
форма является очень самой быстрой. – gogoud 14.11.2016, 12:32