it-roy-ru.com

Найдите все файлы с именем 'name' в системе linux и поищите в них 'text'

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

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

25
siliconpi
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
29
dogbane

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

находить . имя "* .ext" | xargs grep 'находясь в поиске'

6
Amareswar

Более простым было бы,

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

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

3
digen

Пытаться:

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

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

1
codaddict

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

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

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

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