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


12

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

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

编辑:

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


1
如果是清理操作,也许您想要的只是find -mtime +<number of days> -delete清理所有超过特定期限的文件。这将意味着没有必要。
Mikel

Answers:


14

你说“ 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,可以为您提供帮助。要获取它,您必须下载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/^\.\///'

也可以看看:


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

'$\t'符号要求bashor zsh:在Ubuntu 上dashsh之上都无法使用。如果您确实需要使用这些shell,则需要将其更改\tCtrl+ VTab$从开引号之前删除开头。


他可能没有运行ext4。我在所有机器上运行Ubuntu 10.04,但在多个驱动器上运行JFS。AFAIK JFS确实支持创建时间戳。
jwernerny 2011年

确实。我们知道ext3不支持它,而ext4不支持。快速搜索表明它可能与zfs或FreeBSD ufs一起使用,但是在Ubuntu上都不常见!不确定jfs或xfs或其他任何内容。如果您可以找到信息/链接,将很高兴听到更多信息。
Mikel

感谢您提供的非常全面的答案,并提醒您写出更具体的问题;)“查找”在性能上胜出,fs型在ext3上胜出。

2

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

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

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


我对此表示怀疑。 head读取足够的输入后实际上退出。尝试同时使用两者timehead无论如何,该版本在我的系统上要快得多。
Mikel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.