С find:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type fэто поиск только в обычных файлах (также исключая символические ссылки, даже если они указывают на обычные файлы). Если вы хотите искать в любом типе файлов, кроме каталогов (но будьте осторожны, есть некоторые типы файлов, такие как fifos или / dev / zero, которые как правило, вы не хотите читать), замените его -type fна GNU-специфичный ! -xtype d( -xtype dсоответствует файлам типа directory после разрешения символической ссылки)).
С GNU grep:
grep -r pattern /the/dir
(но учтите, что если у вас нет последней версии GNU grep, она будет следовать символическим ссылкам при переходе в каталоги). Нестандартные файлы не будут искать, если вы не добавите -D readопцию. Последние версии GNU grepвсе равно не будут искать внутри символических ссылок.
Очень старые версии GNU findне поддерживают стандартный {} +синтаксис, но там вы можете использовать нестандартный:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Представления могут быть связаны с вводом / выводом. Это время для поиска будет временем, необходимым для чтения всех этих данных из хранилища.
Если данные находятся на избыточном дисковом массиве, чтение нескольких файлов за один раз может повысить производительность (и в противном случае их можно ухудшить). Если производительность не связана с вводом / выводом (потому что, например, все данные находятся в кеше), и у вас есть несколько процессоров, параллельная работа также grepsможет помочь. Вы можете сделать это с помощью GNU xargs«s -Pварианта.
Например, если данные находятся в массиве RAID1 с 3 дисками или если данные находятся в кеше, и у вас есть 3 ЦП, время которых можно сэкономить:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(здесь используется, -n1000чтобы порождать новые grepкаждые 1000 файлов, до 3 параллельно работающих одновременно).
Однако обратите внимание, что если выходные данные grepперенаправлены, вы получите плохо чередующиеся выходные данные 3 grepпроцессов, и в этом случае вы можете запустить его как:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(в недавней системе GNU или FreeBSD) или используйте --line-bufferedопцию GNU grep.
Если patternэто фиксированная строка, добавление -Fопции может улучшить ситуацию.
Если это не многобайтовые символьные данные или если для сопоставления с этим шаблоном не имеет значения, являются ли данные многобайтовыми символами или нет, тогда:
cd /the/dir &&
LC_ALL=C grep -r pattern .
может значительно улучшить производительность.
Если вам приходится часто выполнять такие поиски, вы можете проиндексировать свои данные с помощью одной из многочисленных поисковых систем.
findсxargsилиgrep -R