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

在按创建的时间戳(最早的第一个)排序的目录中列出100个第一个文件的最佳方法是什么。 该目录非常大(大约100000个文件)。

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

编辑:

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

你说“用管道输送需要花费很长时间才能完成”。

原因不是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 -cr更改为ls -tr (最佳选项)或将stat -c $'%Z\t%n'更改为stat -c $'%Y\t%n'


如果你需要创作时间

(简称crtime)

这更难。

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

然后,有一个名为%W的新stat格式,可以在这里帮助您。 要获得它,您必须下载2010年10月或之后发布的GNU Coreutils版本,将其解压缩,编译并安装。

然后,根据你的内核,这可能会工作(没有尝试过)。

 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/^\.\///' 

也可以看看:

  • stat读取来自ext4的crtime
  • 用于在Linux上访问crtime的Ruby脚本

如果你收到关于"'$\t'错误

'$\t'表示法需要bashzsh :它不能在dash或Ubuntu上使用。 如果你真的需要使用这些shell,你需要将任何\t更改为Ctrl + VTab并从开头引号之前删除前导$

如果今天找到做事的另一种方式可能与您的表现问题有关:

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

理论上应该开始输出更快,但我想这取决于滞后的来源。 它可能只需要很长时间来对文件进行排序。