查找文件 newermt 和 grep 文件内容不起作用

查找文件 newermt 和 grep 文件内容不起作用

我在使用 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-01grep -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 filenameexample.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

相关内容