按时间排序列出目录中前 100 个文件的最佳方法

按时间排序列出目录中前 100 个文件的最佳方法

按创建时间戳排序(最早的在前)目录中前 100 个文件的最佳方法是什么?该目录相当大(大约 100000 个文件)。

ls管道输送至需要很长时间才能完成。

编辑:

  • 文件系统是 ext3。
  • 限制文件夹中的文件数量是不值得的,因为这将是一个罕见的“清理”操作,并且文件是由第三方软件生成的。
  • 使用文件修改时间,而不是创建时间提供可接受的解决方案。

答案1

你说“ls管道输送至需要很长时间才能完成”。

造成这种情况的原因不是ls,而是目录中的文件数量。如果单个目录中有 100,000 个文件,那么解决这个问题的任何方法都必须先获取所有 100,000 个文件的信息,然后才能考虑对它们进行排序或打印任何输出。

如果花费的时间太长,真正的解决方案是将文件分成多个目录。

如果你无法将文件分散到多个目录中,有什么方法可以缩小要考虑的文件数量吗? 例如,如果文件名包含日期,也许您可​​以包含通配符,这样系统就不必对 100,000 个文件进行排序。或者它们可能是按顺序编号的?(这可能有帮助,也可能没有帮助,但值得一试。)

您尝试过多少次这样做? 也许值得保存/缓存输出以供重复使用


现在,有一个问题。

你是当然你的意思是“创造时间”而不是“改变时间”? 大部分工具只能显示“修改时间”,而不能显示“创建时间”。

获取“创建时间”是一件非常新的事情,它需要一个 ext4 文件系统和一些不易安装的工具。


如果你想改变时间

更改时间(简称ctime)表示文件属性最后被改变的时间。

ls -c按 ctime 排序。

您希望按升序而不是降序输出,因此您-r也需要使用该选项反转输出。

因此你可以这样做:

ls -cr | head -n 100

对同一问题的更长解决方法是使用stat

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

但它的运行速度比ls -cr我的系统慢。


如果你想要修改时间

修改时间(简称mtime)表示文件内容最后改变的时间。

ls -t按mtime排序。

更改ls -crls -tr(最佳选项) 或更改stat -c $'%Z\t%n'stat -c $'%Y\t%n'


如果你需要创作时间

(简称 crtime)

这更难。

首先,确保目录位于使用 格式化的文件系统上ext4。您可以使用tune2fs -l <device name>来检查这一点。

然后,有一种stat名为 的新格式%W可以帮到你。要获取它,你必须下载一个版本GNU 核心实用程序2010年10月或之后发布的,解压,编译,安装。

然后,根据您的内核,可能有效(还没尝试过)。

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

也可以看看:


如果您收到有关"'$\t'

符号'$\t'需要bash或:它在 Ubuntu 中或上zsh不起作用。如果您确实需要使用这些 shell,则需要将 any 更改为+ ,并删除开头引号之前的前导。dashsh\tCtrlVTab$

答案2

如果发现今天做事的另一种方式可能与您的绩效问题有关:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

理论上,输出速度应该会快很多,但我猜这取决于延迟来自哪里。可能只是需要ls很长时间来对文件进行排序。

相关内容