在按创建的时间戳(最早的最早的)排序的目录中列出前100个文件的最佳方法是什么?该目录很大(大约100000个文件)。
用管道输送到头部需要很长时间才能完成。
编辑:
- 文件系统是ext3。
- 限制文件夹中文件的数量是不值得的,因为这将是罕见的“清理”操作,并且文件是由第三方软件生成的。
- 使用文件修改时间,而不是创建时间提供了可接受的解决方案。
在按创建的时间戳(最早的最早的)排序的目录中列出前100个文件的最佳方法是什么?该目录很大(大约100000个文件)。
用管道输送到头部需要很长时间才能完成。
编辑:
Answers:
你说“ 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
,可以为您提供帮助。要获取它,您必须下载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'
符号要求bash
or zsh
:在Ubuntu 上dash
或sh
之上都无法使用。如果您确实需要使用这些shell,则需要将其更改\t
为Ctrl+ V,Tab并$
从开引号之前删除开头。
find -mtime +<number of days> -delete
清理所有超过特定期限的文件。这将意味着没有必要。