Рекурсивный текстовый поиск с использованием шаблонов 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
find . -name '*.txt' -type f -exec grep <pattern> {} \;
Другие вопросы по тегам