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

13 filesystem ls

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

ls 通过管道传输到头部需要很长时间才能完成。

编辑:

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

Mik*_*kel 14

你说“ LS管道输送到头部需要一个可怕的长时间才能完成”。

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

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

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

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


现在,一个问题。

确定您的意思是“创建时间”而不是“更改时间”?大多数工具只能显示“更改时间”,而不能显示“创建时间”。

获得“创建时间”是一个很新的东西,它需要一个 ext4 文件系统,以及一些不容易安装的工具。


如果你想改变时间

更改时间(简称ctime)是指文件属性最后一次更改的时间。

ls -c 按 ctime 排序。

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

所以你可以这样做:

ls -cr | head -n 100
Run Code Online (Sandbox Code Playgroud)

使用以下方法解决同一问题的较长时间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/^\.\///'
Run Code Online (Sandbox Code Playgroud)

但这比ls -cr我的系统运行得慢。


如果你想修改时间

修改时间(简称mtime)是指文件内容最后一次修改的时间。

ls -t 按时间排序。

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


如果您需要创建时间

(简称crtime)

这更难。

首先,确保目录位于使用ext4. 你可以用它tune2fs -l <device name>来检查这个。

然后,有一种stat名为的新格式%W,它可以在此处为您提供帮助。要获得它,您必须下载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/^\.\///'
Run Code Online (Sandbox Code Playgroud)

也可以看看:


如果你得到关于 "'$\t'

'$\t'符号需要bashzsh:它不会在工作dashsh在Ubuntu。如果您确实需要使用这些外壳,则需要将 any 更改\tCtrl+ VTab并删除$开头引号之前的前导。