it-swarm-ru.tech

Рекурсивный текстовый поиск с использованием шаблонов grep и file

Учитывая этот пример структуры папок:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

Как мне выполнить рекурсивный поиск текста по всем *.txt файлы с grep из "/"?

("grep -r <pattern> *.txt" завершается неудачно при запуске из "/", так как нет .txt файлы в этой папке.)

46
Anders Sandvig

Моя версия GNU Grep имеет переключатель для этого:

grep -R --include='*.txt' $Pattern

Описывается следующим образом:

--include=GLOB

Выполняйте поиск только в тех файлах, базовое имя которых соответствует GLOB (с использованием подстановочных знаков, как описано в разделе --exclude).

62
Kyle Brandt

Если у вас есть большое количество файлов, было бы полезно включить xargs в команду, чтобы избежать ошибки "Список аргументов слишком длинный".

find . -name '*.txt' -print | xargs grep <pattern>
20
Mark

вы можете использовать ваши zsh 's EXTENDED_GLOB опция ( документы )

grep <pattern> **/*.txt
2
santa

Возможно, вы захотите взглянуть на ack по адресу http://betterthangrep.com , где есть средства для выбора файлов для поиска по типу файла.

1
Andy Lester
find . -name '*.txt' -type f -exec grep <pattern> {} \;
0
innaM

Ответ Манниса включил бы новый grep-процесс для каждого текстового файла. Если у вас есть много текстовых файлов, вы можете сначала очистить каждый файл и выбрать .txt-файлы, когда это будет сделано:

grep -r <pattern> * | grep \.txt:

Это более интенсивно использует диск, но в любом случае может быть быстрее.

0
Commander Keen

Это 2019 год, и я никак не мог бы использовать grep для рекурсивного поиска текста.

ИМХО сегодняшние ответы должны включать ripgrep :

rg <pattern> -ttxt
0
santa