Как найти определенный текст в файлах с определенным расширением?
Допустим, я ищу все файлы с .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будет соответствовать файлам без строки.