如何递归列出文件并按修改时间对它们进行排序?

qaz*_*wsx 16 linux ls macos

如何递归列出目录下的所有文件并按修改时间对输出进行排序?

我通常使用,ls -lhtc但它不会递归地找到所有文件。我正在使用 Linux 和 Mac。

ls -l 在 Mac OS X 上可以给

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c
Run Code Online (Sandbox Code Playgroud)

日期部分不一致或对齐的地方,因此解决方案必须考虑到这一点。

部分解决方案

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-
Run Code Online (Sandbox Code Playgroud)

有效,但不是递归的。

Dan*_*son 14

使用find's-printf并按合理的日期格式排序:

find -type f -printf '%T+\t%p\n' | sort -n
Run Code Online (Sandbox Code Playgroud)

这应该最小化进程分叉,因此是最快的。

如果您不喜欢小数第二部分的示例(无论如何通常不会在文件系统中实现):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n
Run Code Online (Sandbox Code Playgroud)

编辑:find Mac 上的标准没有-printf. 但是在 Mac安装 GNU find并不困难(有关 Mac/Linux 兼容性的更多注意事项,另请参阅该链接xargs)。


Com*_*ist 2

stat这是使用@johnshen64 建议的方法

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Run Code Online (Sandbox Code Playgroud)

  • 您使用的是哪个版本的“stat”?你上面的格式不适合我。我必须使用以下内容:`find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | 排序-rn | 切-f2-`。这是使用 `stat (GNU coreutils) 8.23` (3认同)
  • 该解决方案不再有效 - 它对于现代“stat”命令存在多个错误。或者更糟糕的是,即使修复了,它也*慢* - 它为每个文件调用外部“stat”命令。在我的机器上,对于 1000 个文件来说,这很容易花费一整秒的时间。下面是更好的解决方案,使用 find 的“-printf”选项,速度至少快 100 倍 (!)。 (2认同)