计算目录中大量文件的最快/最简单方法是什么(在Linux中)?

Tad*_*eck 10 python linux ls directory-listing

我有一些目录,包含大量文件.每当我尝试访问其中的文件列表时,我都无法做到这一点,或者有明显的延迟.我试图ls在Linux上的命令行中使用命令,而我的托管服务提供商的网络界面也没有帮助.

问题是,当我这样做ls时,甚至需要花费大量时间才能开始显示某些内容.因此,ls | wc -l也无济于事.

经过一些研究后,我想出了这个代码(在这个例子中,它计算了某些服务器上新电子邮件的数量):

print sum([len(files) for (root, dirs, files) in walk('/home/myname/Maildir/new')])
Run Code Online (Sandbox Code Playgroud)

上面的代码是用Python编写的.我使用了Python的命令行工具,它运行得非常快(立即返回结果).

我对以下问题的答案感兴趣:是否可以更快地计算目录(没有子目录)中的文件?最快的方法是什么?

Yan*_*ier 6

ls做了stat(2)每个文件调用.其他工具,如find(1)shell通配符扩展,可以避免这种调用,只是这样做readdir.一个可能有效的shell命令组合find dir -maxdepth 1|wc -l,但它很乐意列出目录本身并错误计算任何带有换行符的文件名.

从Python中,获取这些名称的直接方法是os.listdir(目录).与os.walk和os.path.walk不同,它不需要递归,检查文件类型或进行进一步的Python函数调用.

附录:似乎并不总是统计数据.至少在我的GNU系统上,当没有请求进一步的信息(例如哪些名称是目录)时,它只能进行一个getdents调用.getdents是用于在GNU/Linux中实现readdir的底层系统调用.

增加2:在ls输出结果之前延迟的一个原因是它进行排序和制表.ls -U1可以避免这种情况.


mar*_*eau 6

这在 Python 中应该相当快:

from os import listdir
from os.path import isfile, join
directory = '/home/myname/Maildir/new'
print sum(1 for entry in listdir(directory) if isfile(join(directory,entry)))
Run Code Online (Sandbox Code Playgroud)