按创建时间戳排序(最早的在前)目录中前 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 -cr
为ls -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 更改为+ ,并删除开头引号之前的前导。dash
sh
\t
CtrlVTab$
答案2
如果发现今天做事的另一种方式可能与您的绩效问题有关:
I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done
理论上,输出速度应该会快很多,但我猜这取决于延迟来自哪里。可能只是需要ls
很长时间来对文件进行排序。