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

标签 python linux ls directory-listing

我有一些包含大量文件的目录。每次我尝试访问其中的文件列表时,我都无法访问,或者有很长的延迟。我试图在 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/

相关文章:

linux - 获取 VTE 搜索中的模式匹配数

linux - 为什么我的 .htaccess 文件在我的本地 MAMP 测试服务器上运行良好,但在我的 Linux 生产服务器上却不起作用?

linux - 只有ls操作使用getdents()/getdents64()?

查找命令中的 Linux LS -T 输出

python - python中最短的哈希来命名缓存文件

python - 如何从 BeautifulSoup 中的项目列表中获取文本

javascript - Django : How to access current logged in user's id in javascript?

python - SQLAlchemy - 过滤子查询负载

c - 使用 XDrawString 垂直显示文本

bash - 用 ls 排序十进制数