我在使用 Linux find 和 grep 命令时遇到问题。基本上我需要 CD 到一个目录,递归查找在特定日期之后修改的所有 example.txt 文件,然后对这些文件执行 grep 。下面的命令(在某种程度上)有效,但它给出了同一文件的多个结果,我不确定它有多稳定。
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
答案1
我认为该命令的正确形式是:
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" {} \;
缺少命令{}
中的部分find
。您的查找结果不会传递给 grep。
答案2
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
这find
将从当前目录开始,对每个./
具有 -nameexample.xml
更新(在修改时间)的文件执行该命令。2018-01-01
grep -r "videoplayer.1" /.
但我们看到该grep
命令确实不是考虑找到的文件名find
,但命令始终是不变的。此外,它-r
从文件系统的根( /.
)。现在,这可能是一个拼写错误(./
vs. /.
),但含义完全改变了。
即使使用grep -r ... ./
,搜索也会从当前目录开始递归,而使用-exec
,则搜索是从当前目录find
开始的。
使用 时find -exec
,您需要使用{}
占位符来告诉find
在哪里插入当前正在处理的文件名。所以
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep "videoplayer.1" {} \;
对 2018 年 1 月 1 日之后命名的所有文件运行。grep videoplayer.1 filename
example.xml
实际上,您可以将\;
终止-exec
命令的 替换为 a,+
以将find
多个文件传递给 的一次调用grep
。这将使整个工作更快,因为需要启动的进程更少:
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep "videoplayer.1" {} \+
另外,如果您想确保grep
列出正在处理的文件的名称,您可以使用该-H
标志(至少在 GNU 和 BSD 中grep
):
-H, --with-filename
打印每个匹配的文件名。当有多个文件需要搜索时,这是默认设置。
(另一种方法是-H
将类似的内容添加/dev/null
到给定的文件列表中grep
)