有没有办法列出目录中的所有文件树在单个列表中,在 Linux 上按修改时间排序?
ls -Rlt
递归地列出文件,但它们在输出中分组在不同的文件夹下,因此,输出不会作为一个整体进行排序。只是每个目录的内容是按时间排序的。
答案1
是的,您可以使用 GNU 来做到这一点find
。如果您的文件名不包含换行符,您可以执行以下操作:
find -printf '%T@ %p\n' | sort -gk1,1
解释
选项
-printf
可以find
打印各种信息。在本例中,我们使用:%Tk File's last modification time in the format specified by k, which is the same as for %A. @ seconds since Jan. 1, 1970, 00:00 GMT, with fractional part. %p File's name.
因此,
%T@ %p\n
将打印文件自纪元以来的修改时间(以秒为单位%T@
)、一个空格,然后是文件名 (%p
)。然后将它们传递给仅在第一个字段 ( ) 上
sort
进行数字排序 ( ) 的对象。-n
-k1,1
请注意,这将返回所有文件和目录。要将其限制为仅常规文件(无目录、设备文件、链接等),请添加-type f
到您的find
命令中。
要获得人类可读的日期,您可以使用 GNU 处理输出date
:
find -printf '%T@ %p\t\n' | sort -gk1,1 |
perl -lne 's/([^ ]*)//;chomp($i=`date -d \@$1`); print "$i $_"'
此处,该perl
命令将第一个非空格字符字符串(日期)替换为 GNU 处理的自身date
。
对于包含换行符的文件名,上述操作将失败。要处理换行符,请使用:
find -printf '%p\t%T@\0' | sort -zt$'\t' -nk2 | tr '\0' '\n'
这是同样的事情,只不过会在每个文件名的末尾find
输出 a\0
而不是。 \n
GNUsort
可以处理空分隔的输出,因此它仍然能够正确排序。最终tr
命令将 转换\0
回\n
.
答案2
和zsh
:
print -rl -- **/*(D.om)
**/*匹配任何级别的子目录(并且不遵循符号链接)。D.
限定符列出常规文件,om
按修改时间对它们排序,最新的在前。
如果您希望列出不带目录部分的文件名,请添加t
历史修饰符:
print -rl -- **/*(D.om:t)
答案3
好吧,如果您谈论的是成千上万个文件 - 并且超出了您的ARG_MAX
限制 - 那么结果不会那么好,但最简单的解决方案是:
find . ! -type d -exec ls -t {} +
...它将调用它可以找到的ls
每批文件。<=ARG_MAX
对路径名中的字符也没有任意限制,只是对可以一起处理的参数的最大数量有限制。
它将以与find
的输出相同的方式写入输出。当然,您可以使用任何其他选项,例如-l
GNU 的-h
.以下是我一周前创建的一棵小树中列出的一些内容:
find . ! -type d -exec ls -lht {} +
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 19:00 ./dir/dir1/file
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 19:00 ./dir/dir2/file
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 19:00 ./dir/dir3/file
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 19:00 ./dir2/dir1/file
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 19:00 ./dir2/dir2/file
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 19:00 ./dir2/dir3/file
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 18:57 ./dir/file1
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 18:57 ./dir/file2
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 18:57 ./dir/file3
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 18:57 ./dir2/file1
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 18:57 ./dir2/file2
-rw-r--r-- 1 mikeserv mikeserv 0 Dec 19 18:57 ./dir2/file3
...显然没有按目录分组。
在我的机器上...
getconf ARG_MAX
2091752
......但我认为这不现实。我认为平均大约是 65k 左右。