使用grep和文件模式进行递归文本搜索


46

给定此示例文件夹结构:

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

如何*.txt使用grep“ /”中的所有文件进行递归文本搜索?

"grep -r <pattern> *.txt"从“ /”运行时失败,因为.txt该文件夹中没有文件。)

Answers:


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
纳比·卡兹



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

您可能想使用“ find。-name'* .txt'-type f -exec grep <pattern> {} +”代替,所以它的行为与Mark Robinson的类似-仅适用于GNU find
serverhorror

0

Mannis的答案将为每个文本文件派生一个新的grep进程。如果那里有很多文本文件,则可以考虑先对每个文件进行grep操作,然后在完成后选择.txt文件:

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

那会占用更多的磁盘空间,但无论如何可能会更快。


0

现在是2019年,我仍然无法使用grep进行递归文本搜索。

恕我直言,今天的答案应包括ripgrep

rg <pattern> -ttxt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.