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

2024-09-27 20:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些目录,里面有很多文件。每次我试图访问其中的文件列表时,我都无法这样做,或者出现了明显的延迟。我试图在Linux上的命令行中使用ls命令,而宿主提供商的web界面也没有帮助。

问题是,当我只做ls时,甚至开始显示某个东西都要花费大量的时间。因此,ls | wc -l也没有帮助。

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

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

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

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


Tags: 文件代码命令行命令目录web列表界面
3条回答

给定目录中的文件总数

find . -maxdepth 1 -type f | wc -l

给定目录及其下所有子目录中的文件总数

find . -type f | wc -l

有关更多详细信息,请进入终端并执行man find

ls为每个文件执行一个stat(2)调用。其他工具,如find(1)和shell通配符扩展,可能会避免此调用,只需执行readdir。一个可以工作的shell命令组合是find dir -maxdepth 1|wc -l,但是它很乐意列出目录本身,并错误地计算任何包含新行的文件名。

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

补遗:看起来ls并不总是stat。至少在我的GNU系统上,它只能在不请求进一步信息(例如哪些名称是目录)时执行getdents调用。getdents是用于在GNU/Linux中实现readdir的底层系统调用。

附加2:ls输出结果之前出现延迟的一个原因是它排序和制表。ls-U1可以避免这个。

这在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)))

相关问题 更多 >

    热门问题