Grep в паре тысячи файлов

Для выполнения X-сервера основные пакеты для установки xorg-server, xorg-xinit, и какой бы ни драйвер Вам нужно для Вашей системы. Удостоверьтесь, чтобы у Вас были все три из тех пакетов, xorg-xinit в особенности, кажется, обычно забывают или пропускают.

13
08.08.2013, 01:55
4 ответа

С find:

cd /the/dir
find . -type f -exec grep pattern {} +

(-type f должен только искать в регулярных файлах (также, исключая символьные ссылки, даже если они указывают на регулярные файлы). Если Вы хотите искать в каком-либо типе файла кроме каталогов (но остерегаться существуют некоторые типы файлов как fifos или/dev/zero, который Вы обычно не хотите читать), замена -type f с определенным для GNU ! -xtype d (-xtype d соответствия для файлов каталога типа после разрешения символьной ссылки)).

С GNU grep:

grep -r pattern /the/dir

(но остерегайтесь этого, если у Вас нет последней версии GNU grep, который будет следовать за символьными ссылками при убывании в каталоги). Нерегулярные файлы не будут искаться, если Вы не добавите a -D read опция. Последние версии GNU grep все еще не будет искать внутренние символьные ссылки все же.

Очень старые версии GNU find не поддерживал стандарт {} + синтаксис, но там Вы могли использовать нестандартное:

cd /the/dir &&
  find . -type f -print0 | xargs -r0 grep pattern

Действиями, вероятно, будет связанный ввод-вывод. Это - время, чтобы сделать, поиск был бы временем, должен был считать все те данные с устройства хранения данных.

Если данные находятся на избыточном дисковом массиве, читать несколько файлов за один раз могло бы улучшить производительность (и мог ухудшить их иначе). Если действиями не является связанный ввод-вывод (потому что, например, все данные находятся в кэше), и у Вас есть несколько центральных процессоров, параллельных greps мог бы помочь также. Можно сделать это с GNU xargs -P опция.

Например, если данные находятся на массиве RAID1 с 3 дисками, или если данные находятся в кэше, и у Вас есть 3 центральных процессора чье свободное время:

cd /the/dir &&
  find . -type f -print0 | xargs -n1000 -r0P3 grep pattern

(сюда использование -n1000 порождать новое grep каждые 1 000 файлов, до 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 .

мог значительно улучшить производительность.

Если Вы заканчиваете тем, что часто делали такие поиски, то можно хотеть индексировать данные с помощью одной из многих поисковых систем там.

19
27.01.2020, 19:53

Все файлы в каталоге

grep 'search string' *

с рекурсивно

grep -R 'search string' *
-2
27.01.2020, 19:53
  • 1
    Хотеть разработать-1? –  Markus 07.08.2013, 12:31
  • 2
    я не сделал downvote, но существует несколько проблем с Вашим: OP упомянул, что "аргумент перечисляет слишком долго", который Ваш первый не зафиксирует и, вероятно, что OP делал прежде. Второй не помогает ни одному в том отношении (помог бы, использовали Вас . вместо *). * исключит точечные файлы (хотя с-R, не теми в рекурсивно вызванных каталогах).-R в противоположность-r следует за символьными ссылками даже с последними версиями GNU grep. У Вас также будет проблема с файлами в текущем каталоге, имя которого запускается с - –  Stéphane Chazelas 07.08.2013, 14:20

26 000 файлов в единственном каталоге много для большинства файловых систем. Вероятно, что значительная часть времени является снятыми показаниями этот большой каталог. Считайте разделение его в меньшие каталоги только с несколькими сотнями файлов каждым.

Вызов find не может объяснить низкая производительность, если Вы не делаете это неправильно. Это - быстрый способ пересечь каталог, и обеспечения, чтобы Вы не рисковали пытаться выполнить командную строку, это слишком длинно. Удостоверьтесь, что Вы используете -exec grep PATTERN {} +, который упаковывает столько файлов, сколько это может на вызов команды, и нет -exec grep PATTERN {} \;, который выполняется grep однажды на файл: выполнение команды однажды на файл, вероятно, будет значительно медленнее.

3
27.01.2020, 19:53
  • 1
    Спасибо, я погуглю что-то об этом, и вероятно я разделю это. Я сделал точно, о чем Вы пишете, и это взяло в 3 раза дольше, чем только grep... –  user2778979 09.08.2013, 14:53

Если вам нужно просмотреть ВСЕ файлы несколько раз (, как вы сказали, запустив скрипт )Я бы посоветовал заглянуть в оперативные диски, скопировать туда все файлы, а затем выполнить поиск файлов несколько раз, это ускорит увеличьте свой поиск как минимум в 100 раз.

Вам просто нужно достаточно оперативной памяти. В противном случае вам следует изучить индексацию файлов, например. в lucene или базу данных nosql, а затем запускать запросы к ней.

1
27.01.2020, 19:53

Теги

Похожие вопросы