我有一个包含很多文件(网站生成的各种日志)的文件夹。
设法统计它们的数量:
$ find . -maxdepth 1|wc -l
803313
现在我需要检查过去几天的日志。获取最后 100 / 1000 / ... 个文件也不错。问题是上述命令大约需要 5 秒钟。因此,在将近 100 万个文件的情况下,我的常规方法ls -lrt|tail -n 100
不是一个选择。
那么,关于如何有效获取最后修改的文件有什么想法吗?
PS:使用 Ubuntu 12.04 LTS
答案1
Find 本身可以过滤某个时间范围内的文件。你说你想要几天前更新的文件:
find . -maxdepth 1 -ctime -3
这将查找过去 3 天内更改的所有文件。
您可以使用 -ctime(文件状态更改)、-mtime(文件的数据更改)和 -atime(文件访问更改)。
如果您需要更精细的粒度,请使用 -cmin、-mmin 和 -amin(使用分钟而不是天)。
时间范围可以是普通数字,也可以使用 +/- 符号,如下所示:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
因此-mtime -3
将返回 3 天(及更短)前修改的文件。-mtime 3
将返回 3 天前修改的文件(请注意,小数部分将被丢弃,因此这将返回 3 至 4 天前修改的文件)。-mtime +3
将返回 3 天(及以上)前修改的所有文件。
答案2
您可以使用 printf 打印日期,%T@
像 unix 时间戳一样提供修改时间:
find . -type f -printf "%T@ %p\n" | sort -rn | head -n 10
对于包含 250,000 个文件的文件夹,这需要 10 秒。
边注:查找这您可以使用
find . -type f -printf "%T@\0%p\0" | gawk ' { if ($0>max) { max=$0; getline mostrecent } else getline } END{print mostrecent}' RS='\0'
对于 250,000 个文件来说,这只需不到 2 秒的时间。