如何在目录树中找到最旧的文件

如何在目录树中找到最旧的文件

我正在寻找一个 shell 单行命令来查找目录树中最旧的文件。

答案1

这有效(已更新以纳入 Daniel Andersson 的建议):

find -type f -printf '%T+ %p\n' | sort | head -n 1

答案2

这个的可移植性更强一些,而且因为它不依赖于 GNUfind扩展-printf,所以它也可以在 BSD / OS X 上运行:

find . -type f -print0 | xargs -0 ls -ltr | head -n 1

唯一的缺点是它的大小有点受限于ARG_MAX应该对于大多数较新的内核来说无关紧要)。因此,如果返回的字符数超过getconf ARG_MAX(在我的系统上是 262,144),它不会给出正确的结果。它也不符合 POSIX 标准,因为-print0xargs -0不符合。

这里列出了更多针对此问题的解决方案:如何找到目录中的最新(最新、最早、最旧)文件? – Greg's Wiki

答案3

以下命令保证可以处理任何类型的奇怪文件名:

find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat

find -type f -printf "%T@ %T+ %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'

stat -c "%y %n" "$(find -type f -printf "%T@ %p\0" | \
    sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"

使用空字节 ( \0) 而不是换行符 ( \n) 可确保在其中一个文件名包含换行符的情况下 find 的输出仍然可以理解。

-z开关使 sort 和 grep 都只将空字节解释为行尾字符。由于 head 没有这样的开关,grep -m 1因此我们使用(仅出现一次)。

命令按执行时间排序(在我的计算机上测量)。

  • 第一个命令将是最慢的,因为它必须先将每个文件的修改时间转换为人类可读的格式,然后对这些字符串进行排序。通过管道传输到 cat 可避免对输出进行着色。

  • 第二个命令稍快一些。虽然它仍然执行日期转换,但sort -n对自 Unix 纪元以来经过的秒数进行数字排序()要快一些。sed 会删除自 Unix 纪元以来的秒数。

  • 最后一个命令根本不进行任何转换,应该比前两个命令快得多。 find 命令本身不会显示最旧文件的修改时间,因此需要 stat。

相关手册页:寻找grepsed种类统计

答案4

请使用 ls — 手册页会告诉您如何对目录进行排序。

ls -clt | head -n 2

-n 2 是为了让您在输出中不获得“总数”。如果您只想要文件的名称。

ls -t | head -n 1

如果您需要按正常顺序获取列表(获取最新文件)

ls -tr | head -n 1

比使用 find 更容易、更快、更强大 - 不必担心文件命名格式。它也应该适用于几乎所有系统。

相关内容