Linux终端:仅在给定文件扩展名的文件中递归搜索字符串;显示文件名和绝对路径

时间:2015-09-24 10:25:48

标签: linux shell terminal grep

我是Linux终端的新手;使用Ubuntu Peppermint 5。

我希望在文件名中具有给定文件扩展名(例如'* .doc')的所有文件中递归搜索所有目录中的给定文本字符串(例如'mystring');然后显示所有匹配项的文件名和绝对文件路径列表。我不需要看到任何内容。

这一定是个常见问题。我希望能找到一种快速有效地进行搜索的解决方案,并且记忆简单并输入终端。

我尝试过使用'cat','grep','find'和'locate'以及各种选项,并以不同的组合方式进行管道连接,但我还没有找到办法完成上述操作。

讨论了类似的事情: How to show grep result with complete path or file name

和: Recursively search for files of a given name, and find instances of a particular phrase AND display the path to that file

但是我无法想办法让这些方法适应上述情况,并对任何建议表示感谢。

2 个答案:

答案 0 :(得分:1)

根据grep手册,您可以使用--include选项执行此操作(如果您只想要名称,则可以使用-l选项 - 我通常使用-n显示行号:

  

<强> --include= 水珠

     

使用--exclude中所述的通配符匹配,仅搜索名称与 glob 匹配的文件。

     

<强> -l

     

<强> --files-with-matches

     

抑制正常输出;而是打印通常打印输出的每个输入文件的名称。每个文件的扫描在第一场比赛时停止。 (-l由POSIX指定。)

一个合适的 glob 将是“* .doc”(确保引用它,以允许shell将传递给 grep)。 / p>

GNU grep还有一个递归选项-r(不在POSIX grep中)。与globbing一起,您可以搜索“.doc”文件的目录树,如下所示:

grep -r -l --include="*.doc" "mystring" .

如果你想让它变得便携,那么就可以开始find了。但是使用grep扩展名可以使搜索速度更快,并且可以在任何Linux平台上使用。

答案 1 :(得分:1)

  找到。 -name'* .doc'-exec grep -l'mystring'{} \; -print

工作原理:

从给定路径.

递归查找搜索

表示名称为'*.doc'

的所有文件

-exec grep对找到的文件执行grep

禁止grep -l

的输出

并在文件中搜索'mystring'

grep的表达式以{} \;

结尾

-print打印出grep创建mystring的所有名称。

编辑: 要仅获取当前目录的结果而不进行递归,您可以添加: -maxdepth 0找到。