[英]Find top 500 oldest files
如何找到最旧的500个文件?
我尝试过的
find /storage -name "*.mp4" -o -name "*.flv" -type f | sort | head -n500
使用GNU find和GNU sort查找500个最旧的文件:
#!/bin/bash
typeset -a files
export LC_{TIME,NUMERIC}=C
n=0
while ((n++ < 500)) && IFS=' ' read -rd '' _ x; do
files+=("$x")
done < <(find /storage -type f \( -name '*.mp4' -o -name '*.flv' \) -printf '%T@ %p\0' | sort -zn)
printf '%q\n' "${files[@]}"
更新-一些说明:
正如乔纳森(Jonathan)在评论中提到的那样,处理此问题的正确方法涉及许多非标准功能,这些功能允许产生和使用以空分隔的列表,以便可以安全地处理任意文件名。
GNU find的-printf
生成mtime(使用未记录的%T@
格式。我的猜测是,是否起作用取决于您的C库),其后是一个空格,后跟一个以\\0
结尾的文件名。 输出还有两个附加的非标准功能:GNU sort的-z
选项和read
内置的-d
选项,其中带有空的option参数将输入定界为null。 总体效果是按find
的-printf
字符串产生的mtime对元素进行sort
,然后将前500个结果读入数组,使用IFS
在空间上将read
的输入分割开,并将第一个元素丢弃为_
变量,仅保留文件名。
最后,我们使用%q
格式打印出数组,以明确显示结果,并保证每行一个文件。
进程替换( <(...)
语法)不是完全必要的,但是避免了在缺少lastpipe
选项的版本中由管道引起的子lastpipe
。 如果您决定使脚本比仅打印结果更复杂,那么这可能是一个优势。
这些功能都不是GNU独有的。 所有这些都可以使用AST find(1) ,openbsd sort(1)
以及Bash,mksh,zsh或ksh93( v
或更高版本)来完成。 不幸的是, find
格式字符串不兼容。
以下内容查找最旧的500个文件,而最旧的文件位于列表顶部:
find . -regex '.*.\(mp4\|flv\)' -type f -print0 | xargs -0 ls -drt --quoting-style=shell-always 2>/dev/null | head -n500
以上是管道。 第一步是查找文件名,这是通过find完成的。 查找的任何选项都可以用来选择您感兴趣的文件。 第二步进行排序。 xargs
通过按相反的顺序按时将文件名传递给ls
来完成此操作,以便最早的文件位于顶部。 最后一步是head -n500
,它仅使用前500个文件名。 这些名称中的第一个将是最早的文件。
如果文件数超过500,则head
在ls
之前终止。 如果发生这种情况, ls
将发出一条消息: terminated by signal 13
。 我从xargs命令重定向stderr以消除此无害的消息。
上面的解决方案假定所有文件名都可以放在外壳程序的一个命令行中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.