查找前500个最旧的文件

时间:2014-02-09 21:00:21

标签: linux bash find

如何找到前500个最旧的文件?

我尝试了什么:

find /storage -name "*.mp4" -o -name "*.flv" -type f | sort | head -n500

2 个答案:

答案 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上分隔输入。总体效果是sortfind的{​​{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中的一个命令行中。