是否可以像这样使grep
命令输出带有文件修改日期的文件路径:
12-02-2015 /file/path/to/the/file
16-02-2015 /file/path/to/the/file
25-02-2015 /file/path/to/the/file
03-04-2015 /file/path/to/the/file
或者:
/file/path/to/the/file 12-02-2015
/file/path/to/the/file 12-02-2015
/file/path/to/the/file 12-02-2015
/file/path/to/the/file 12-02-2015
答案1
grep
本身没有这个功能。但您可以使用awk
。使用该语法:
grep -Hr pattern . | awk -F: '{"stat -c %z "$1 | getline r; print r": "$0 }'
这会强制grep
打印文件名-H
。-r
表示在给定目录中进行递归搜索.
。awk
的字段分隔符设置为:
。第一个变量$1
现在包含文件名。对每个文件名awk
进行调用stat -c %z
,以人类可读的格式提供修改时间。这被保存到变量中r
,并打印在每个搜索结果的前面。
答案2
这是一个更容易理解的替代方法,使用 xargs
grep -rl pattern | xargs stat -c %n':'%z | awk -F: '{print $1}'
答案3
事实证明您可以使用find -exec
它来做到这一点。以下不是一个完整的示例,因为它没有输出所要求的格式。
find . -exec grep -q set {} \; -exec stat -c "%y %n" {} \;
...
2019-06-03 11:46:14.565890000 -0700 ./bin/tkdiff_helper.sh
2018-04-24 12:00:02.389077000 -0700 ./bin/start_vnc.older 2019-09-04
08:41:49.021891000 -0700 ./bin/calmdpv_2016
...
仅当 grep 找到匹配项时,第二个 exec 才会运行。
-q
是相当 grep。
答案4
grep 实用程序不是为此而设计的,而是用于过滤文件或命令输出中的行。您可以通过管道将它与 awk 结合起来以获得所需的结果,如下所示:
find . -iname 'file-you-want-to-find' -exec stat -c "%y %n" {} \; | awk '{ print $4 " " $1 }' | grep 'date-you-are-looking-for'
此致。