在日期范围内搜索所有创建的文件

38

我正在使用Ubuntu操作系统。我想在创建日期范围为2012年5月28日至2012年5月30日的所有日志文件中搜索一个单词(比如XYZ)。

我应该怎么做?


Server Fault 上的相关问题:http://serverfault.com/q/122824/36963 - brandizzi
3个回答

45

这与Banthar的解决方案略有不同,但可以在不支持-newermt选项的find版本中使用,并展示了如何使用非常实用的xargs命令。

您可以使用find命令查找“某个年龄段内”的文件。这将找到5至10天前修改的所有文件:

 find /directory -type f -mtime -10 -mtime +5

然后在这些文件中搜索字符串:

 find /directory -type f -mtime -10 -mtime +5 -print0 |
   xargs -0 grep -l expression

除了使用-exec开关外,您还可以使用xargs,但我发现xargs更易读(在某些情况下也可能表现更好,但在这种情况下可能不是这样)。

(请注意,-0标志存在是为了让该命令操作带有嵌入空格的文件,例如this is my filename。)

更新评论中的问题

当您向find提供多个表达式时,它们会AND在一起。例如,如果您请求:

find . -name foo -size +10k

...find命令只会返回文件名为foo且文件大小大于10k的文件。同样地,如果您指定:

find . -mtime -10 -mtime +5

...find 只会返回创建时间在10天之内且早于5天之前的文件。

例如,我的系统当前是:

$ date
Fri Aug 19 12:55:21 EDT 2016

我有以下文件:

$ ls -l
total 0
-rw-rw-r--. 1 lars lars 0 Aug 15 00:00 file1
-rw-rw-r--. 1 lars lars 0 Aug 10 00:00 file2
-rw-rw-r--. 1 lars lars 0 Aug  5 00:00 file3

如果我要求查找“修改时间在5天前的文件(-mtime +5)”,那么会得到:

$ find . -mtime +5
./file3
./file2

但是如果我要求“文件修改时间在5天前但是10天前之内”(-mtime +5 -mtime -10),我将得到:

$ find . -mtime +5 -mtime -10
./file2

1
有人能解释一下如何使用两次指定-mtime来指定一个范围吗?具体来说,为什么第一次出现是负数,第二次是正数?我不知道是我理解错了还是在Ubuntu 14.04.3 LTS上无法工作。在我看到的man页面中没有讨论这个问题。 - battey
@battey,我已经更新了我的答案,并回答了你的问题。 - larsks

20

find 与 grep 结合使用:

find -newermt "28 May 2012" -not -newermt "30 May 2012" -exec grep XYZ \{\} \;

1
这个-newermt选项似乎没有记录 - 在链接和我的手册页中都没有出现。然而,它非常棒!你是怎么发现它的? - brandizzi
2
@brandizzi 它在“-newerXY”下面。 - Piotr Praszmo

-1

find 似乎没有选项可以指定时间戳比较的特定日期(至少我电脑上的版本没有 - 可能有其他版本和/或类似的工具),所以你必须使用天数。 因此,截至2012/06/05,您要查找比9天新但早于6天的文件:

find . -type f -ctime -9 -ctime +6 -print0 | xargs -0 grep XYZ

为什么不用 -mtime(修改时间)?-ctime 是状态时间(无论那是什么)。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接