Для цього є два простих рішення. В основному, використовуючи 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вихід.