如何找到最旧的 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\0' | sort -zn)
printf '%q\n' "${files[@]}"
更新 - 一些解释:
正如 Jonathan 在评论中提到的那样,处理此问题的正确方法涉及许多非标准功能,这些功能允许生成和使用以 null 分隔的列表,以便可以安全地处理任意文件名。
GNU 发现的 -printf
生成 mtime(使用未记录的 %T@
格式。我的猜测是这是否有效取决于您的 C 库)后跟一个空格,然后是文件名以 \0
结尾.两个额外的非标准功能处理输出:GNU 排序的 -z
选项,以及 read
内置的 -d
选项,它带有一个空的选项参数来分隔空值的输入。整体效果是有sort
按 find
产生的 mtime 对元素进行排序的 -printf
字符串,然后使用 IFS
将前 500 个结果读入数组拆分read
的空间输入并将第一个元素丢弃到 _
中变量,只留下文件名。
最后,我们使用 %q
打印出数组格式只是为了明确地显示结果,并保证每行一个文件。
进程替换(<(...)
语法)并非完全必要,但避免了在缺少 lastpipe
的版本中由管道引入的子 shell。选项。如果您决定使脚本比仅仅打印结果更复杂,这可能是一个优势。
这些功能都不是 GNU 独有的。所有这些都可以使用例如完成AST find(1) , 开放系统 sort(1)
,以及 Bash、mksh、zsh 或 ksh93(v
或更高)。不幸的是 find
格式字符串不兼容。
关于linux - 查找前 500 个最旧的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21664982/