Найдите все файлы с именем 'name' в системе linux и поищите в них 'text' - PullRequest
25 голосов
/ 24 сентября 2010

Мне нужно найти все экземпляры файла filename.ext в системе linux и посмотреть, какие из них содержат текст Lookinging

Есть ли набор операций командной строки linux, которые будут работать?

Ответы [ 5 ]

29 голосов
/ 25 сентября 2010
find / -type f -name filename.ext -exec grep -l 'lookingfor' {} +

Использование + для завершения команды более эффективно, чем \;, поскольку find отправляет целый пакет файлов на grep вместо отправки их один за другим.Это позволяет избежать форка / exec для каждого найденного файла.

Некоторое время назад я провел некоторое тестирование для сравнения производительности xargs против {} + против {} \; и обнаружил, что {} +было быстрееВот некоторые из моих результатов:

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
6 голосов
/ 24 сентября 2010

Перейдите в соответствующий каталог и введите следующую команду.

найти. имя "* .ext" | xargs grep 'Lookingfor'

3 голосов
/ 24 сентября 2010

Более простой вариант:

find / -type f -name filename.ext -print0 | xargs -0 grep  'lookingfor'

-print0 для поиска & 0 to xargs уменьшит проблему большого количества файлов в одном каталоге.

1 голос
/ 24 сентября 2010

Попробуйте:

find / -type f -name filename.ext -exec grep -H -n 'lookingfor' {} \;

find рекурсивно ищет, начиная с корня /, файлы с именем filename.ext, и для каждого найденного вхождения он запускает grep для имени файла в поисках lookingfor и, если он найден, печатает номер строки (-n) и имя файла (-H).

0 голосов
/ 15 декабря 2016

Я считаю следующую команду самым простым способом:

grep -R --include="filename.ext" lookingfor

или добавьте -i к поиску без учета регистра:

grep -i -R --include="filename.ext" lookingfor
...