С 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