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

46

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

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

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

(происходит "grep -r <pattern> *.txt"сбой при запуске из «/», поскольку .txtв этой папке нет файлов.)

Андерс Сандвиг
источник

Ответы:

61

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

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

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

--include=GLOB

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

Кайл Брандт
источник
19

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

find . -name '*.txt' -print | xargs grep <pattern>
отметка
источник
6
Если в именах файлов или каталогов есть пробелы, используйте эту форму: find. -name '* .txt' -print0 | xargs -0 grep <pattern>
Джейсон Лютер
2
И, конечно же, существует проблема имен файлов, которые начинаются с -.
TJ Crowder
grepбыстрее find.
Наби KAZ
2

Вы могли бы быть в состоянии использовать ваш zsh«S EXTENDED_GLOBварианта ( документы )

grep <pattern> **/*.txt
Санта
источник
Только если OP использует zsh, но, тем не менее, интересно.
Закон 29
1

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

Энди Лестер
источник
0
find . -name '*.txt' -type f -exec grep <pattern> {} \;
InnaM
источник
вы могли бы вместо этого использовать "find. -name '* .txt' -type f -exec grep <pattern> {} +", так что он скорее ведет себя подобно версии с Марком Робинсоном - работает только с GNU find, насколько мне известно.
serverhorror
0

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

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

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

Командир Кин
источник
0

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

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

rg <pattern> -ttxt
Санта
источник