如何找到前500个最旧的文件?
我尝试了什么:
find /storage -name "*.mp4" -o -name "*.flv" -type f | sort | head -n500
答案 0 :(得分:1)
使用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
builtin的-d
选项,其中带有空选项参数,用于在null上分隔输入。总体效果是sort
按find
的{{1}}字符串生成的mtime对元素进行排序,然后使用-printf
将前500个结果读入数组拆分IFS
在空间上的输入并将第一个元素丢弃到read
变量中,只留下文件名。
最后,我们使用_
格式打印出数组,只是为了明确显示结果,并保证每行一个文件。
进程替换(%q
语法)不是完全必要的,但避免了在缺少<(...)
选项的版本中由管道引起的子shell。如果您决定使脚本比仅打印结果更复杂,那么这可能是一个优势。
这些功能都不是GNU独有的。所有这些都可以使用例如完成。 AST find(1),openbsd lastpipe
,以及Bash,mksh,zsh或ksh93(sort(1)
或更高版本)。遗憾的是,v
格式字符串不兼容。
答案 1 :(得分:0)
以下内容列出了列表顶部最旧的500个文件:
find . -regex '.*.\(mp4\|flv\)' -type f -print0 | xargs -0 ls -drt --quoting-style=shell-always 2>/dev/null | head -n500
以上是一个管道。第一步是找到由find完成的文件名。任何find选项都可用于选择您感兴趣的文件。第二步是排序。这是通过xargs
将文件名传递给ls
并按时间顺序按相反顺序完成的,以便最旧的文件位于顶部。最后一步是head -n500
,它只获取前500个文件名。这些名称中的第一个将是最早的文件。
如果文件超过500个,则head
会在ls
之前终止。如果发生这种情况,ls
会发出消息:terminated by signal 13
。我从xargs命令重定向stderr以消除这种无害的消息。
上述解决方案假设所有文件名都可以放在shell中的一个命令行中。