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


13

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

我通常使用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-

可行,但不递归。


我假设您使用的是Linux,但是您应该在问题中或明确地将其指定为标签来明确指定操作系统。
EBGreen

Answers:


2

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

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-

find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-将打印在OS X只是将文件的绝对路径
LRI

stat您使用的是哪个版本?您上面的格式对我不起作用。我必须使用以下内容:find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-。这是与stat (GNU coreutils) 8.23
user84207'9

12

使用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

编辑:find Mac上的Standard 没有-printf。但是在Mac安装GNU find并不困难(另请参见该链接,以获取有关Mac / Linux兼容性和的更多警告xargs)。


0

find .应该能够获取所有文件。像这样:

find . -exec ls -dl '{}' \; | sort -k 6,7

您需要根据需要对其进行调整。


我还假定它是linux,就像EBGreen所说的那样,ls是Windows PS中的别名,因此,如果是这种情况,则需要使用sort-object并递归获取子项,但想法是相同的。
johnshen64 '04

在Mac上,当日期有时缺少年份部分时,它真的可以正常工作吗?
qazwsx 2012年

没错,最近文件的日期显示会弄乱事情。在这种情况下,您需要使用stat来获取准确格式化的日期。我的文件都非常旧,因此命令运行正常,这就是为什么我添加了tune子句:-)
johnshen64'4

@ johnshen64:ls在Linux上,--time-format您可以使用一个选项来确保最近和较旧的文件日期都以相同的格式显示。
RedGrittyBrick 2012年

嗯,谢谢,您是对的,只是没有使用过。这比使用stat简单得多。我认为这被称为-时间风格。
johnshen64 '04 -4-24

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.