我有一些包含大量文件的目录。每次我尝试访问其中的文件列表时,我都无法访问,或者有很长的延迟。我试图在 Linux 的命令行中使用 ls
命令,而我的托管服务提供商的 Web 界面也没有帮助。
问题是,当我只是执行 ls
时,甚至开始显示某些内容都需要花费大量时间。因此,ls | wc -l
也无济于事。
经过一些研究,我想出了这段代码(在这个例子中它计算了一些服务器上的新邮件数量):
print sum([len(files) for (root, dirs, files) in walk('/home/myname/Maildir/new')])
以上代码是用Python编写的。我使用了 Python 的命令行工具,它运行得非常快(立即返回结果)。
我对以下问题的答案很感兴趣:是否可以更快地计算目录(没有子目录)中的文件数?最快的方法是什么?
最佳答案
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 并不总是统计。至少在我的 GNU 系统上,它只能在不请求更多信息(例如哪些名称是目录)时执行 getdents 调用。 getdents 是用于在 GNU/Linux 中实现 readdir 的底层系统调用。
补充 2:在 ls 输出结果之前延迟的一个原因是它排序和制表。 ls -U1 可以避免这种情况。
关于python - 计算目录中大量文件的最快/最简单方法是什么(在 Linux 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083006/