列出按时间排序的目录中的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'
表示法需要bash
或zsh
:它不能在dash
或Ubuntu上使用。 如果你真的需要使用这些shell,你需要将任何\t
更改为Ctrl + V , Tab并从开头引号之前删除前导$
。
如果今天找到做事的另一种方式可能与您的表现问题有关:
I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done
理论上应该开始输出更快,但我想这取决于滞后的来源。 它可能只需要很长时间来对文件进行排序。