查找目录树中最新的 500 个文件的命令,并且符合 POSIX

Posted

技术标签:

【中文标题】查找目录树中最新的 500 个文件的命令,并且符合 POSIX【英文标题】:find command for the newest 500 files in a directory tree and also be POSIX compliant 【发布时间】:2012-06-06 23:45:46 【问题描述】:

我正在寻找单行 shell 脚本或 unix 命令来在目录树中查找最新的 500 个文件。主要限制是它应该符合 POSIX 并且目录可以包含大量文件。

【问题讨论】:

如果你真的有“吨”,可能有超过 500 个文件具有相同的日期戳。应该怎么处理? 如果它像 ls -rt 一样工作对我来说没问题。 【参考方案1】:

我从下面的链接中找到了一个 perl 脚本,它有帮助:

find . -type f -print | perl -l -ne ' $_$_ = -M; END   $,="\n";   print sort $_$b <=> $_$a keys %_   ' | head -n 500

How to recursively find and list the latest modified files in a directory with subdirectories and times?

欢迎任何更多的 cmets。谢谢大家。

【讨论】:

【参考方案2】:

这个怎么样:

Posix ls 和 head

ls -tc DIR | head -n 500

【讨论】:

ls 并不完全可靠,因为它的输出并不意味着机器可读,所以在一般情况下应该避免这种情况。如果你的文件名是有规律的,你可能会相处得很好,但有一天它可能会毁了你。【参考方案3】:

找到 . -type f -print | perl -l -ne ' $$ = -M; END $,="\n";打印排序 $$b $$a 键 %_ ' |头 -n 500

$$a $$b

的排序应该是相反的

头部可以避开:print+(...)[0..499]

使用递归调用也可以找到:

perl -e 'sub R($_)=@_;map-d$_?&R($_):$_<$_/*>print$_,$/for(sort-M$a<=>-M$bR".")[0..499]'

或者使用 unix cmd:不确定是否有太多参数可能会失败

find . -type f -exec ls -1t  + | head -500
find . -type f -print0 | xargs -0 ls -1t | head -500

【讨论】:

【参考方案4】:
find . -type f -exec stat -c %Y:%n  \; |
  sort -rn | sed -e 's/.*://' -e 500q

这个按ctime排序,可以在格式字符串中使用%Z%X来改变,但stat不是POSIX。

【讨论】:

【参考方案5】:

没有 100% 可靠的 POSIX 方式使用 shell 脚本来执行此操作。

一个 POSIX C 程序可以很容易地做到这一点,假设您通过最后修改的文件内容或最后修改的文件定义最新的。如果您指的是上次创建时间,则没有 POSIX 方式,也可能根本没有解决方案,具体取决于所使用的文件系统。

【讨论】:

以上是关于查找目录树中最新的 500 个文件的命令,并且符合 POSIX的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell 命令 :删除所有日志文件保留最新的 3 个文件

locate命令

linux如何查找文件

find 查找文件或目录 及du命令

8.4.4.Zookeeper结构和命令

Linux下搜索文件常用方法