Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

--include=GLOB

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

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

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

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

grep <pattern> **/*.txt

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

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

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

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

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

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

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

rg <pattern> -ttxt