Мне нужно найти все экземпляры "filename.ext" в системе Linux и посмотреть, какие из них содержат текст "lookfor".
Есть ли набор операций командной строки linux, которые будут работать?
Мне нужно найти все экземпляры "filename.ext" в системе Linux и посмотреть, какие из них содержат текст "lookfor".
Есть ли набор операций командной строки linux, которые будут работать?
find / -type f -name filename.ext -exec grep -l 'lookingfor' {} +
Использование +
для завершения команды более эффективно, чем \;
, потому что find
отправляет целую партию файлов в grep
вместо отправки по одному. Это позволяет избежать fork/exec для каждого найденного файла.
Некоторое время назад я провел некоторое тестирование, чтобы сравнить производительность xargs
vs {} +
vs {} \;
, и я обнаружил, что {} +
работает быстрее. Вот некоторые из моих результатов:
time find . -name "*20090430*" -exec touch {} +
real 0m31.98s
user 0m0.06s
sys 0m0.49s
time find . -name "*20090430*" | xargs touch
real 1m8.81s
user 0m0.13s
sys 0m1.07s
time find . -name "*20090430*" -exec touch {} \;
real 1m42.53s
user 0m0.17s
sys 0m2.42s
Перейдите в соответствующий каталог и введите следующую команду.
найти. -name "*.ext" | xargs grep 'Lookingfor'
Более простой был бы,
find / -type f -name filename.ext -print0 | xargs -0 grep 'lookingfor'
-print0 для поиска и от 0 до xargs уменьшит проблему большого количества файлов в одном каталоге.
Try:
find / -type f -name filename.ext -exec grep -H -n 'lookingfor' {} \;
find
ищет рекурсивно, начиная с корня /
для файлов с именем filename.ext
, и для каждого найденного вхождения он запускает grep по имени файла, ищущему для lookingfor
, и, если найден, печатает номер строки (-n
) и имя файла (-H
).
Я нахожу следующую команду самым простым способом:
grep -R --include="filename.ext" lookingfor
или добавить -i
для поиска нечувствительности к регистру:
grep -i -R --include="filename.ext" lookingfor