Рекурсивный текстовый поиск с использованием шаблонов grep и file
Учитывая этот пример структуры папок:
/folder1/file1.txt /folder1/file2.djd /folder2/file3.txt /folder2/file2.fha
Как мне сделать рекурсивный поиск текста на всех *.txt
файлы с grep
от "/"?
("grep -r <pattern> *.txt"
не работает при запуске из "/", так как нет .txt
файлы в этой папке.)
7 ответов
Моя версия GNU Grep имеет переключатель для этого:
grep -R --include='*.txt' $Pattern
Описывается следующим образом:
--include=GLOB
Выполняйте поиск только в тех файлах, базовое имя которых соответствует GLOB (с использованием подстановочных знаков, как описано в разделе --exclude).
Если у вас есть большое количество файлов, было бы полезно включить xargs в команду, чтобы избежать ошибки "Список аргументов слишком длинный".
find . -name '*.txt' -print | xargs grep <pattern>
Вы могли бы использовать свой zsh
"s EXTENDED_GLOB
вариант ( документы)
grep <pattern> **/*.txt
Возможно, вы захотите взглянуть на ack на http://betterthangrep.com/, где есть средства для выбора файлов для поиска по типу файла.
Ответ Манниса включил бы новый grep-процесс для каждого текстового файла. Если у вас есть много текстовых файлов, вы можете сначала очистить каждый файл и выбрать.txt-файлы, когда это будет сделано:
grep -r <pattern> * | grep \.txt:
Это более интенсивно, но в любом случае может быть быстрее.
Это 2019 год, и я никак не мог бы использовать grep для рекурсивного поиска текста.
ИМХО сегодняшние ответы должны включать ripgrep:
rg <pattern> -ttxt