【问题标题】:How do I list all the files in a directory and subdirectories in reverse chronological order?如何按时间倒序列出目录和子目录中的所有文件?
【发布时间】:2024-01-08 23:02:01
【问题描述】:

我想做ls -t 之类的事情,但也包含子目录中的文件。但问题是我不希望像ls -R 那样格式化输出,就像这样:

[test]$ ls -Rt
b       testdir test

./testdir:
a

我希望它的格式类似于find 命令显示子目录中的文件。即:

[test]$ find .
.
./b
./test
./testdir
./testdir/a

但是find 似乎没有做的是按最后更新时间按时间顺序排列结果。

那么我怎样才能以find 的格式列出目录和子目录中的所有文件,但按时间倒序排列?

【问题讨论】:

标签: unix find ls


【解决方案1】:

ls -lR是显示当前目录的所有文件、目录和子目录 ls -lR | more 用于显示流中的所有文件。

【讨论】:

  • 对不起,但我不明白这为什么会在主目录中列出内容?标志“R”用于递归列出子目录,我在 ls 手册页中没有看到对主目录的引用。据我所知,无论您身在何处,它都会列出子目录。
  • 良好而直接的答案:)
【解决方案2】:

如果您要查看的文件数符合最大参数限制,您可以使用 globbing 来获得所需内容,如果您支持 globstar,则使用递归。

对于 2 层深度使用:ls -d * */*

使用 globstar,用于递归:ls -d **/*

ls-d 参数告诉它不要递归作为参数传递的目录(因为您正在使用 shell 通配符进行递归)。这可以防止 ls 使用其递归格式。

【讨论】:

  • @YoYo 感谢您删除了我在底部多余的解释行。我尝试提交带有单字符更改的编辑,但由于更改太小而被 SO 拒绝。你知道有没有办法解决这个问题?
【解决方案3】:

wfg5475's answer 中的命令运行正常,只需要添加一件事,只显示目录和子目录中的文件:

ls -ltraR |egrep -v '\.$|\.\.|\.:|\.\/|total|^d' |sed '/^$/d'

添加了一件事:^d 忽略列表输出中的所有目录

【讨论】:

    【解决方案4】:

    试试这个:

    ls -ltraR |egrep -v '\.$|\.\.|\.:|\.\/|total' |sed '/^$/d'
    

    【讨论】:

      【解决方案5】:

      试试 find . -type d 要么 find . -type d -ls

      【讨论】:

      • 您能否就这回答问题的原因添加更多解释。
      【解决方案6】:

      试试这个:

      find . -type f -printf "%T@ %p\n" | sort -nr | cut -d\  -f2-
      

      【讨论】:

      • 仅供参考,这只适用于 GNU 的 find。好吧,至少 FreeBSD 上的 find 不支持 printf 命令。
      • find . -type f -printf "%p\n" 还不够吗?
      • @TelmoTrooper 如果您想要排序,则不要。额外的字符数按最后修改时间进行排序。如果你不关心这种排序,你的版本就足够了。
      【解决方案7】:
      find -type f -print0 | xargs -0 ls -t
      

      缺点:仅适用于一定数量的文件。如果你有大量的文件,你需要更复杂的东西

      【讨论】:

      • 您错过了添加搜索域:find . -type f -print0 | xargs -0 ls -t,但是您的解决方案在 mac os 上运行,与此处列出的其他解决方案不同
      最近更新 更多