我正在寻找一个 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 标准,因为-print0
和xargs -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。
答案4
请使用 ls — 手册页会告诉您如何对目录进行排序。
ls -clt | head -n 2
-n 2 是为了让您在输出中不获得“总数”。如果您只想要文件的名称。
ls -t | head -n 1
如果您需要按正常顺序获取列表(获取最新文件)
ls -tr | head -n 1
比使用 find 更容易、更快、更强大 - 不必担心文件命名格式。它也应该适用于几乎所有系统。