如何在特定日期的文件中搜索特定字符串?
例如,我有 3 个文件,名为
'a1' dated: 20 Feb,
'a2' dated 21 Feb,
'a3' dated 22 Feb.
现在我想在日期 = '21 Feb' 的所有文件中搜索某个字符串,例如 'JMS111'。
我尝试了以下命令但没有成功:
ls -lt |grep 'JMS111' -ctime 2019/02/21
find -name '*.xml' -type f -printf '%Tw:%h/%f\0' | grep 'JMS111'
答案1
解决此问题的一种方法是设置时间戳文件以将您要查找的日期括起来:
touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time
...然后请求find
比开始时间更新的文件,但是不是比结束时间更新:
find . -type f -newer /tmp/start-time ! -newer /tmp/end-time
把它们放在一起:
touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time
find . -type f -newer /tmp/start-time ! -newer /tmp/end-time -name '*.xml' -exec grep JMS111 /dev/null {} +
rm /tmp/start-time /tmp/end-time
这将在正确的时间范围内查找名称以 结尾的文件.xml
,然后将这些文件名传递给grep
,每次传递尽可能多的文件名。我已添加/dev/null
一个“文件”供 grep 搜索,以及来自 的文件名find
(如果有)。这样,如果只有一个匹配的文件,则grep
“强制”报告匹配的文件名(因为 /dev/null 永远不会匹配,因此不会报告)。
您的输出将是这些文件的文件名和匹配行。
答案2
您可以使用
find . -name 'a[123]' -ctime 6 | xargs grep -l 'JMS111'
它将-ctime 6
查找任何 6 天前的文件。它实际上会将文件的创建日期与运行命令之前的 6*24 小时和 7*24 小时之间的 24 小时期间进行比较。如果创建日期在该时间段内,并且文件名是“a1”、“a2”或“a3”,则find
打印该文件的路径。由于 -ctime <n> 指定的时间段基于运行 find 命令的时间,因此如果明天运行 find 命令,则必须使用与今天运行 find 命令不同的值。
注意:如果您使用-ctime -6
,find 将打印 6 天或更少天前的文件名,-ctime +6
将打印 6 天或更早的文件名。另外,某些版本的 find 允许您指定测量单位,例如 6h,代表 6 小时。
-mtime
如果您想搜索修改时间而不是创建时间,则可以使用。
使用xargs
可以轻松检查在执行grep
.另外,如果将 grep 放入-exec
主数据库中, find 会为找到的每个文件调用一次它,而 则会xargs
接收一个文件列表,并将其传递给 的单次调用grep
,这样资源密集度较低。
一个缺点是-ctime
您必须计算自文件创建以来的天数,但您可以通过运行来计算出
find . -ctime n | xargs ls -l
直到您看到包含您感兴趣的日期的文件。
...而且,您不必像删除-newer
.
答案3
答案4
这将起作用:
$ grep -e JMS111 *20190221*.txt