Для выполнения X-сервера основные пакеты для установки xorg-server
, xorg-xinit
, и какой бы ни драйвер Вам нужно для Вашей системы. Удостоверьтесь, чтобы у Вас были все три из тех пакетов, xorg-xinit
в особенности, кажется, обычно забывают или пропускают.
С 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 .
мог значительно улучшить производительность.
Если Вы заканчиваете тем, что часто делали такие поиски, то можно хотеть индексировать данные с помощью одной из многих поисковых систем там.
Все файлы в каталоге
grep 'search string' *
с рекурсивно
grep -R 'search string' *
.
вместо *
). *
исключит точечные файлы (хотя с-R, не теми в рекурсивно вызванных каталогах).-R в противоположность-r следует за символьными ссылками даже с последними версиями GNU grep. У Вас также будет проблема с файлами в текущем каталоге, имя которого запускается с -
– Stéphane Chazelas
07.08.2013, 14:20
26 000 файлов в единственном каталоге много для большинства файловых систем. Вероятно, что значительная часть времени является снятыми показаниями этот большой каталог. Считайте разделение его в меньшие каталоги только с несколькими сотнями файлов каждым.
Вызов find
не может объяснить низкая производительность, если Вы не делаете это неправильно. Это - быстрый способ пересечь каталог, и обеспечения, чтобы Вы не рисковали пытаться выполнить командную строку, это слишком длинно. Удостоверьтесь, что Вы используете -exec grep PATTERN {} +
, который упаковывает столько файлов, сколько это может на вызов команды, и нет -exec grep PATTERN {} \;
, который выполняется grep
однажды на файл: выполнение команды однажды на файл, вероятно, будет значительно медленнее.
Если вам нужно просмотреть ВСЕ файлы несколько раз (, как вы сказали, запустив скрипт )Я бы посоветовал заглянуть в оперативные диски, скопировать туда все файлы, а затем выполнить поиск файлов несколько раз, это ускорит увеличьте свой поиск как минимум в 100 раз.
Вам просто нужно достаточно оперативной памяти. В противном случае вам следует изучить индексацию файлов, например. в lucene или базу данных nosql, а затем запускать запросы к ней.