Как найти определенный текст в файлах с определенным расширением?
Допустим, я ищу все файлы с .log
расширение, содержащее текст abc
,
При поиске файлов с любым расширением будет выглядеть (Ссылка: /questions/130989/kak-vklyuchit-postoyannuyu-optsiyu-v-sozdatele-diska/131012#131012)
find / -xdev -type f -print0 | xargs -0 grep -H "abc"
Как мы могли бы изменить это так, что он будет искать только файлы с .log
расширение?
Я буду более чем счастлив, если вы покажете лучшую команду.
1 ответ
Решение
TL;DR
добавлять -iname "*.log"
после /
на ваш find
команда. Обратитесь к странице руководства для получения дополнительной информации
Более подробный ответ
Задача под рукой заключается в следующем:
- Список файлов, которые соответствуют шаблону
*.log
- казнить
grep
для каждого файла, чтобы найти, содержит ли он определенную строку. - Перечислите имя файла, у которого есть совпадение на
stdout
Пример того, как это можно сделать, можно увидеть ниже:
$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+
По сути, в игре есть 3 вещи:
find
выполняет работу по поиску файлов и вызовуgrep
за список имен файлов в-exec ...{} \+
структура, где{}
будет заменен всеми найденными именами файлов.-iname "*.log"
может обеспечить совпадение имен файлов без учета регистра-exec . . .{} \+
называет низкий уровеньexecve
функция, которая будет порождатьgrep -l
со списком всех файлов, найденных перед ним (вместо{}
).\+
это опция, которая указывает дляexecve
упаковать как можно больше файлов передgrep
(предел устанавливаетсяARG_MAX
переменная, специфичная дляexec
и для Ubuntu на2097152
как может быть показаноgetconf ARG_MAX
команда). Как только предел достигнут,exec
будет повторять звонокgrep
с большим количеством файлов, упакованных в качестве аргументов.\
необходимо обеспечить+
интерпретируется как аргументfind
а не как другая команда оболочки.-l
опция или grep показывает файлы с соответствующей строкой.-L
будет соответствовать файлам без строки.