我正在使用Ubuntu机器并尝试使用以下命令来搜索文本:
此命令以递归方式检查给定目录中是否存在该字:
1)此处<hello>
是我搜索的单词,它在从当前目录开始的所有文件中递归搜索。它工作正常。
grep -r "<hello>" .
2)现在我想将搜索限制为仅限于特定文件,仅限于xml
个文件:
grep --include=\*.{java} -rnw '/home/myfolder/' -e "<hello>"
这次命令花费更多时间,最后没有给出任何结果。但我的文件有内容。
我已经通过这个链接 - How do I find all files containing specific text on Linux?来编写我的第二个命令。
我的第二个命令有问题吗?还有一个执行速度快的备用命令吗?
答案 0 :(得分:7)
最好使用find
,因为grep
的include / exclude可能会让人感到有些困惑:
find -type f -name "*.xml" -exec grep -l 'hello' {} +
这会查找名称以.xml
结尾的文件,并对其执行grep 'hello'
。使用-l
(L),我们将打印文件名,而不是匹配的行。
find -type f
这会在给定的目录结构中找到文件。-name "*.xml"
选择名称以.xml
结尾的文件。-exec
对find
命令的每个结果执行命令。-exec grep -l 'hello' {} +
对给定文件执行grep -l 'hello'
。使用{} +
,我们引用了匹配的名称(它就像执行grep 'hello' file
,但引用了find
命令提供的文件的名称)。此外,grep -l
(L)返回文件名,而不是匹配本身。答案 1 :(得分:0)
好的,问题是 - xml_grep][1]
不是纯文本,不管看起来有多么类似。因此它并不适合传统的&#39; grepping。
我是否可以建议您查看[XML::Twig
哪个是find -exec
包附带的实用程序?
或者,如果您能够提供有关源内容和所需输出的更具体示例,我们可以提供更具体的答案。
无论如何,除此之外 - 我不会做一个递归的grep,而是find
。 String
允许您首先过滤文件,并且效率很高......但实际上您无需阅读每个匹配的文件以进行检查。
答案 2 :(得分:0)
这对我来说很有用,用GNU *.xml
搜索*.java
和grep
个文件:
grep --include=\*.{xml,java} -rl '/path' -e 'hello'
在你的问题中,你有-w
作为标志,这意味着匹配整个单词。