Mar*_*nas 84
这有效(更新以纳入 Daniel Andersson 的建议):
find -type f -printf '%T+ %p\n' | sort | head -n 1
Run Code Online (Sandbox Code Playgroud)
slh*_*hck 17
这个更便携一点,因为它不依赖于 GNUfind扩展-printf,所以它也适用于 BSD/OS X:
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
Run Code Online (Sandbox Code Playgroud)
这里唯一的缺点是它的大小在某种程度上受到限制ARG_MAX(这对于大多数较新的内核来说应该是无关紧要的)。因此,如果getconf ARG_MAX返回的字符数超过了(在我的系统上为 262,144),它不会为您提供正确的结果。它也不符合 POSIX,因为-print0并且xargs -0不是。
此处概述了此问题的更多解决方案:如何在目录中找到最新(最新、最早、最旧)的文件?– 格雷格的维基
Den*_*nis 12
以下命令保证可以处理任何类型的奇怪文件名:
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/[^ ]* //')"
Run Code Online (Sandbox Code Playgroud)
使用空字节 ( \0) 而不是换行符 ( \n) 可确保在文件名之一包含换行符的情况下, find 的输出仍然可以理解。
该-z开关使 sort 和 grep 都仅将空字节解释为行尾字符。由于 head 没有这样的开关,我们grep -m 1改为使用(仅出现一次)。
命令按执行时间排序(在我的机器上测量)。
第一个命令将是最慢的,因为它必须首先将每个文件的 mtime 转换为人类可读的格式,然后对这些字符串进行排序。管道到 cat 避免了输出着色。
第二个命令稍微快一点。虽然它仍然执行日期转换,但数字排序 ( sort -n) 自 Unix 纪元以来经过的秒数要快一些。sed 删除自 Unix 纪元以来的秒数。
最后一个命令根本不进行转换,应该比前两个命令快得多。find 命令本身不会显示最旧文件的 mtime,因此需要 stat。
相关手册页:find – grep – sed – sort – stat
尽管这里接受的答案和其他人可以完成这项工作,但如果您有一个非常大的树,所有这些人都会对整堆文件进行排序。
如果我们可以列出它们并跟踪最旧的,而根本不需要排序,那就更好了。
这就是为什么我想出了这个替代解决方案:
ls -lRU $PWD/* | awk 'BEGIN {cont=0; oldd=strftime("%Y%m%d"); } { gsub(/-/,"",$6); if (substr($1,0,1)=="/") { pat=substr($1,0,length($0)-1)"/"; }; if( $6 != "") {if ( $6 < oldd ) { oldd=$6; oldf=pat$8; }; print $6, pat$8; count++;}} END { print "Oldest date: ", oldd, "\nFile:", oldf, "\nTotal compared: ", count}'
Run Code Online (Sandbox Code Playgroud)
我希望它可能有任何帮助,即使问题有点老。
编辑 1:此更改允许解析带有空格的文件和目录。它的速度足以在根目录中发出它/并找到有史以来最旧的文件。
ls -lRU --time-style=long-iso "$PWD"/* | awk 'BEGIN {cont=0; oldd=strftime("%Y%m%d"); } { gsub(/-/,"",$6); if (substr($0,0,1)=="/") { pat=substr($0,0,length($0)-1)"/"; $6="" }; if( $6 ~ /^[0-9]+$/) {if ( $6 < oldd ) { oldd=$6; oldf=$8; for(i=9; i<=NF; i++) oldf=oldf $i; oldf=pat oldf; }; count++;}} END { print "Oldest date: ", oldd, "\nFile:", oldf, "\nTotal compared: ", count}'
Run Code Online (Sandbox Code Playgroud)
命令解释:
运行它:
~$time ls -lRU "$PWD"/* | awk 等
最旧日期:19691231
文件:/home/.../.../backupold/.../EXAMPLES/how-to-program.txt
比较总数:111438
真正的 0m1.135s
用户 0m0.872s
系统 0m0.760s
编辑2:相同的概念,用更好的解决方案find看存取时间(使用%T与第一printf的修改时间或%C对状态变化,而不是)。
find . -wholename "*" -type f -printf "%AY%Am%Ad %h/%f\n" | awk 'BEGIN {cont=0; oldd=strftime("%Y%m%d"); } { if ($1 < oldd) { oldd=$1; oldf=$2; for(i=3; i<=NF; i++) oldf=oldf " " $i; }; count++; } END { print "Oldest date: ", oldd, "\nFile:", oldf, "\nTotal compared: ", count}'
Run Code Online (Sandbox Code Playgroud)
编辑 3:下面的命令使用修改时间,并在发现越来越旧的文件时打印增量进度,这在您有一些不正确的时间戳(如 1970-01-01)时很有用:
find . -wholename "*" -type f -printf "%TY%Tm%Td %h/%f\n" | awk 'BEGIN {cont=0; oldd=strftime("%Y%m%d"); } { if ($1 < oldd) { oldd=$1; oldf=$2; for(i=3; i<=NF; i++) oldf=oldf " " $i; print oldd " " oldf; }; count++; } END { print "Oldest date: ", oldd, "\nFile:", oldf, "\nTotal compared: ", count}'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
99548 次 |
| 最近记录: |