Для этого есть два простых решения. В основном, используя xargs
или parallel
.
XARGS подход:
Вы можете использовать xargs
с find
следующим:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Где вы замените number_of_processes
максимальное количество процессов, которые вы хотите запустить. Однако это не гарантирует значительную производительность в случае, если ваша производительность ограничена вводом / выводом. В этом случае вы можете попытаться запустить больше процессов, чтобы компенсировать потерянное время ожидания ввода-вывода.
Кроме того, с помощью поиска можно указать более сложные параметры, а не только шаблоны файлов, такие как время модификации и т. Д.
Одна возможная проблема с этим подходом, как объяснено комментариями Стефана, если файлов мало, xargs
может не запустить достаточно много процессов для них. Одним из решений будет использование -n
опции для xargs
указания количества аргументов, которые он должен принимать из канала за раз. Установка -n1
заставит xargs
начать новый процесс для каждого отдельного файла. Это может быть желательным поведением, если файлы очень велики (как в случае с этим вопросом) и существует относительно небольшое количество файлов. Однако если сами файлы небольшие, накладные расходы на запуск нового процесса могут подорвать преимущество параллелизма, и в этом случае большее -n
значение будет лучше. Таким образом, -n
опция может быть точно настроена в соответствии с размерами и количеством файлов.
Параллельный подход:
Другой способ сделать это - использовать инструмент Ole Tange GNU Parallel parallel
(доступен здесь ). Это обеспечивает больший контроль над параллелизмом и даже может быть распределен по нескольким хостам (было бы полезно, например, если ваш каталог используется совместно). Простейший синтаксис с использованием параллельного будет:
find . -type f | parallel -j+1 grep mypattern
где опция -j+1
указывает параллельно запускать один процесс сверх количества ядер на вашем компьютере (это может быть полезно для задач с ограниченным вводом / выводом, вы можете даже попытаться увеличить их количество).
Параллель также имеет преимущество перед xargs
фактическим сохранением порядка вывода из каждого процесса и генерацией непрерывного вывода. Например, xargs
если, если процесс 1 генерирует строку, скажем p1L1
, процесс 2 генерирует строку p2L1
, процесс 1 генерирует другую строку p1L2
, вывод будет:
p1L1
p2L1
p1L2
тогда как с parallel
выводом должно быть:
p1L1
p1L2
p2L1
Это обычно более полезно, чем xargs
вывод.