展平递归目录列表的输出

展平递归目录列表的输出

有没有办法列出目录中的所有文件在单个列表中,在 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而不是。 \nGNUsort可以处理空分隔的输出,因此它仍然能够正确排序。最终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的输出相同的方式写入输出。当然,您可以使用任何其他选项,例如-lGNU 的-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 左右。

相关内容