З find:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type fце пошук лише у звичайних файлах (також виключаючи символьні посилання, навіть якщо вони вказують на звичайні файли). Якщо ви хочете шукати в будь-якому типі файлів, крім каталогів), але будьте обережні, деякі файли типу fifos або / dev / zero як правило, ви не хочете читати), замініть -type fна специфічний для GNU ! -xtype d( -xtype dвідповідає файлам каталогу типів після роздільної здатності symlink)).
З GNU grep:
grep -r pattern /the/dir
(але майте на увазі, що якщо у вас є остання версія GNU grep, це буде слідувати посиланнями під час сходу в каталоги). Нерегулярні файли не будуть шукатись, якщо ви не додасте -D readпараметр. Останні версії GNU grepвсе ще не будуть шукати всередині посилань.
Дуже старі версії GNU findне підтримували стандартний {} +синтаксис, але там ви можете використовувати нестандартні:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Виступи, ймовірно, пов'язані введенням / виводом. Це час для пошуку був би час, необхідний для того, щоб прочитати всі ці дані зі сховища.
Якщо дані знаходяться на надлишковому масиві диска, читання декількох файлів одночасно може покращити продуктивність (і може погіршити їх інакше). Якщо виконання не пов'язане введенням / виведенням (оскільки, наприклад, всі дані знаходяться в кеші), а у вас є декілька процесорів, одночасно grepsможе допомогти і одночасно . Ви можете зробити це з допомогою GNU xargs«s -Pваріанту.
Наприклад, якщо дані знаходяться на масиві RAID1 з 3 дисками, або якщо дані знаходяться в кеші, і у вас є 3 процесора, час для збереження яких:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(тут використовується -n1000для нерестування нових grepкожні 1000 файлів, до 3 одночасно працюючих).
Однак зауважте, що якщо результат grepперенаправлення, ви отримаєте погано переплетений вихід із трьох 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 .
може значно покращити продуктивність
Якщо ви часто шукаєте такі пошукові запити, можливо, ви можете проіндексувати свої дані за допомогою однієї з багатьох пошукових систем там.
findзxargsабоgrep -R