Допустим, я ищу все файлы с расширением .log
, которые содержат текст abc
.
При поиске файлов с любым расширением будет выглядеть (Ref .: https://unix.stackexchange.com/a/16140/38353 )
find / -xdev -type f -print0 | xargs -0 grep -H "abc"
Как мог мы изменим это так, что он будет искать только файлы с расширением .log
?
Я буду более чем счастлив, если вы покажете лучшую команду.
TL; DR
Добавить -iname "*.log"
после /
к Вашему find
команда. Обратитесь к странице справочника для большего количества информации
Более подробный ответ
Задача под рукой следующая:
*.log
grep
на каждый файл, чтобы найти, содержит ли это определенную строку.stdout
Пример того, как это может быть выполнено, виден рев:
$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+
По существу существует 3 вещи в действии:
find
делает задание нахождения файлов И вызова grep
на список имен файлов в -exec ...{} \+
структура, где {}
будет заменен со всеми найденными именами файлов.-iname "*.log"
может обеспечить соответствие случая-insensetive имен файлов-exec . . .{} \+
называет низкий уровень execve
функция, которая будет метать икру grep -l
со списком всех файлов, найденных перед ним (вместо {}
). \+
опция, которая указывает для execve
упаковать максимально любые файлы перед grep
(предел устанавливается ARG_MAX
переменная, характерно для exec
, и поскольку Ubuntu в 2097152
как можно показать getconf ARG_MAX
команда). После того как предел достигнут, exec
повторит вызов к grep
с большим количеством файлов, упакованных как аргументы. \
необходимо для обеспечения +
интерпретируется как аргумент find
и не как другая команда оболочки.-l
опция или grep показывают файлы с совпавшей строкой. -L
соответствовал бы файлам без строки.