如何递归列出目录下的所有文件并按修改时间对输出进行排序?
我通常使用,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
日期部分不一致或不一致,因此解决方案必须考虑到这一点。
部分解决方案
stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-
有效,但不是递归的。
答案1
stat
以下是@johnshen64 建议的方法
find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
答案2
使用find
并按-printf
合理的日期格式排序:
find -type f -printf '%T+\t%p\n' | sort -n
这应该可以最大限度地减少进程分叉,从而达到最快的速度。
如果您不喜欢秒的小数部分(通常文件系统中不会实现),请参见以下示例:
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
编辑:Mac 的标准配置find
没有-printf
。但这并不难在 Mac 上安装 GNU find(另请参阅该链接了解有关 Mac/Linux 兼容性和的更多注意事项xargs
)。
答案3
find .
应该能够获取所有文件。如下所示:
find . -exec ls -dl '{}' \; | sort -k 6,7
您需要根据您的需要进行调整。
答案4
在我的 Linux 上,需要进行一些小的调整,stat
因为coreutils
:
find . -type f -exec stat -c "%y %N" "{}" \;
要查找最近的 20 个文件,请排序撤销按修改时间排序:
find . -type f -exec stat -c "%y %N" "{}" \; | sort -rn | head -20 | cut -f2-
从stat
(手动的)文档:
%y - Time of last modification
%Y - Time of last modification as seconds since Epoch
%n - File name
%N - Quoted file name with dereference if symbolic link