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
.
与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)
归档时间: |
|
查看次数: |
2222 次 |
最近记录: |