展平递归目录列表的输出

mah*_*007 8 ls recursive files

有没有办法在单个列表中列出目录中的所有文件,在 Linux 上按修改时间排序?

ls -Rlt 
Run Code Online (Sandbox Code Playgroud)

递归地列出文件,但它们在输出中被分组在不同的文件夹下,因此,输出没有作为一个整体进行排序。只有每个目录的内容按时间排序。

ter*_*don 12

是的,你可以用 GNU 做到这一点find。如果您的文件名不包含换行符,您可以执行以下操作:

find -printf '%T@ %p\n' | sort -gk1,1
Run Code Online (Sandbox Code Playgroud)

解释

  • 可以打印各种信息的-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.
    
    Run Code Online (Sandbox Code Playgroud)

    因此,%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 $_"'
Run Code Online (Sandbox Code Playgroud)

在这里,该perl命令将第一个非空格字符字符串(日期)替换为由 GNU 处理的自身date


对于包含换行符的文件名,上述操作将失败。要处理换行符,请使用:

find -printf '%p\t%T@\0' | sort -zt$'\t' -nk2 | tr '\0' '\n'
Run Code Online (Sandbox Code Playgroud)

除了find将在每个文件名的末尾输出\0而不是之外,这是相同的事情\n。GNUsort可以处理空分隔的输出,因此它仍然能够正确排序。最后一个tr命令将\0返回转换为\n.


cuo*_*glm 6

zsh

print -rl -- **/*(D.om)
Run Code Online (Sandbox Code Playgroud)

**/*匹配任何级别的子目录(并且不遵循符号链接)。D.限定符列出常规文件,om按修改时间排序,最新的在前。

如果您希望在没有目录部分的情况下列出文件名,请添加t历史修饰符:

print -rl -- **/*(D.om:t)
Run Code Online (Sandbox Code Playgroud)