查找前500个最旧的文件



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

我尝试过的:

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

使用GNU查找和GNU排序查找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' | sort -zn)
printf '%qn' "${files[@]}"

更新-一些解释:

正如Jonathan在评论中提到的,处理这一问题的正确方法包括许多非标准功能,这些功能允许生成和使用空分隔列表,以便可以安全地处理任意文件名。

GNUfind的-printf产生mtime(使用未记录的%T@格式。我的猜测是,这是否有效取决于你的C库),然后是一个空格,然后是带有终止的文件名。另外两个非标准特性处理输出:GNU排序的-z选项和read内置的-d选项,后者使用空选项参数将输入分隔为null。总的效果是让sort按照find-printf字符串产生的mtime对元素进行排序,然后将前500个结果读取到一个数组中,使用IFS在空间上拆分read的输入,并将第一个元素丢弃到_变量中,只留下文件名。

最后,我们使用%q格式打印出数组,只是为了明确显示结果,并保证每行一个文件。

进程替换(<(...)语法)不是完全必要的,但在缺少lastpipe选项的版本中避免了管道引发的子shell。如果您决定使脚本比仅仅打印结果更复杂,那么这可能是一个优势。

这些特性都不是GNU独有的。所有这些都可以使用例如AST find(1)、openbsdsort(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个文件,则headls之前终止。如果发生这种情况,ls将发出一条消息:terminated by signal 13。我从xargs命令重定向了stderr,以消除这个无害的消息。

上面的解决方案假设所有文件名都可以放在shell中的一个命令行中。

相关内容

  • 没有找到相关文章

最新更新