Для цього є два простих рішення. В основному, використовуючи xargs
або parallel
.
Підхід xargs:
Ви можете використовувати xargs
з find
наступним чином :
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Де ви заміните number_of_processes
максимальну кількість процесів, які ви хочете запустити. Однак це не гарантує ваших значних показників у випадку, якщо ваша продуктивність обмежена введенням / виводом. У такому випадку ви можете спробувати запустити більше процесів, щоб компенсувати втрачений час очікування вводу-виводу.
Крім того, за допомогою включення знаходження ви можете вказати більш вдосконалені параметри, а не просто шаблони файлів, наприклад час модифікації тощо.
Одне можливе питання такого підходу, як пояснено коментарями Stéphane, якщо файлів мало, 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
вихід.