Рекурсивный текстовый поиск с использованием шаблонов 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


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

вы могли бы вместо этого использовать "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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.