关于perl:查找目录树中最新500个文件的命令,并且也符合POSIX标准

find command for the newest 500 files in a directory tree and also be POSIX compliant

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


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

它应该与排序$$A<=>$$B相反。

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

使用递归调用查找:

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

或者使用unix命令:不确定是否有to-many参数可能失败

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

我在下面的链接中发现了一个Perl脚本,它有助于:

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

如何在具有子目录和时间的目录中递归查找和列出最新修改的文件?

欢迎发表评论。谢谢大家。


这个怎么样?

POSIX LS和HEAD

1
ls -tc DIR | head -n 500


对于shell脚本,没有100%可靠的POSIX方法可以做到这一点。

不过,POSIX C程序将很容易做到这一点,假设您通过最后修改的文件内容或最后更改的文件来定义最新的内容。如果您指的是最后一次创建时间,那么根据所使用的文件系统的不同,没有POSIX方式,也可能根本没有解决方案。


1
2
find . -type f -exec stat -c %Y:%n {} \; |
  sort -rn | sed -e 's/.*://' -e 500q

在ctime上进行排序,可以在格式字符串中使用%Z%X进行更改,但stat不是posix。