Нет смысла использовать find
: grep
поставляется с рекурсивной опцией, -r
. Чтобы просто получить список имен файлов с совпадениями (в отличие от списка всех совпадающих строк во всех файлах), вы можете использовать опцию -l
. Если вы хотите полностью игнорировать все двоичные файлы, вы можете использовать опцию --binary-files=without-match
. Если вы хотите игнорировать только файлы с определенным расширением, вы можете использовать опцию --exclude
, например, --exclude=*.{jpg,jpeg}
, чтобы игнорировать все файлы, заканчивающиеся на .jpg
или .jpeg
. Таким образом, вы должны быть в состоянии получить то, что вы хотите с этим:
grep -r -l --binary-files=without-match .
Теперь вы упомянули в одном из ваших комментариев, что ваша версия grep
не имеет параметров -r
или -l
. Это прискорбно, и я рекомендую получить более свежую версию grep
(предпочтительно разновидности GNU).
Еще одно замечание: если вы используете find -exec
, вы должны использовать +
для завершения команды вместо точки с запятой, например ::
find . -exec grep options '{}' '+'
Используя +
, find
отключит только один процесс и передаст все совпадающие имена файлов в качестве аргументов командной строки одному экземпляру grep
. Пока у вас нет миллиона подходящих файлов (что создаст командную строку гораздо дольше, чем может обработать оболочка), это будет намного, намного быстрее. Если вместо этого вы используете точку с запятой, find
разветвляет новый процесс для каждого соответствующего файла, что очень медленно для очень большого количества файлов.