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的命令行工具,它运行得非常快(立即返回结果).
我对以下问题的答案感兴趣:是否可以更快地计算目录(没有子目录)中的文件?最快的方法是什么?
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可以避免这种情况.
这在 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)