Учитывая этот пример структуры папок:
/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