linux - 查找前 500 个最旧的文件

标签 linux bash find

如何找到最旧的 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选项,它带有一个空的选项参数来分隔空值的输入。整体效果是有sortfind 产生的 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/

相关文章:

ruby-on-rails - 如何在安装了 Ruby on Rails 的系统上使用 RVM?

bash - 如何在Visual Studio中将Bash Shell脚本作为构建事件运行?

linux - 使用 $1 在 bash 脚本中使用 awk 提取一些文本

bash - 使用ssh启动后台进程,运行实验脚本,然后将其停止

c - 我的代码在读取和写入设备文件时出了什么问题

linux - 有没有办法在保留分支名称的同时通过提交哈希使用 "git log --oneline"过滤?

regex - 为什么find -regex不接受我的正则表达式?

java - 如何在netbeans中使用方法定义查找值?

mysql - :first, :order in Rails 3? 的正确查找语法

linux - 我们可以使用终端来测试修改后的内核代码吗?