З 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