查找目录树中最新的 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的主要内容,如果未能解决你的问题,请参考以下文章