【问题标题】:How to determine number of files on a drive with Python?如何使用 Python 确定驱动器上的文件数?
【发布时间】:2010-10-09 02:56:51
【问题描述】:

我一直试图弄清楚如何使用 python 检索(快速)给定 HFS+ 驱动器上的文件数。

我一直在玩 os.statvfs 之类的东西,但什么都得不到(这对我来说似乎很有帮助)。

有什么想法吗?

编辑:让我更具体一点。 =]

出于各种原因,我正在围绕 rsync 编写类似时间机器的包装器,并且希望能够非常快速地估计(不一定是完美的)rsync 将要扫描的驱动器上的文件数量。这样,我可以在 rsync 构建初始文件列表时查看进度(如果您将其称为 rsync -ax --progress,或使用 -P 选项),并向用户报告百分比和/或 ETA。

这与实际备份完全分开,跟踪进度没有问题。但是对于我正在处理数百万个文件的驱动器,这意味着用户正在观察文件数量的计数器在几分钟内没有上限。

到目前为止,我已经尝试完全按照其中一个答案中描述的方法使用 os.statvfs,但结果对我来说没有意义。

>>> import os
>>> os.statvfs('/').f_files - os.statvfs('/').f_ffree
64171205L

更便携的方式在这台机器上给了我大约 110 万,这与我在这台机器上看到的所有其他指标相同,包括 rsync 运行它的准备工作:

>>> sum(len(filenames) for path, dirnames, filenames in os.walk("/"))
1084224

请注意,第一种方法是即时的,而第二种方法让我在 15 分钟后回来更新,因为它只需要很长时间才能运行。

有谁知道获取此数字的类似方法,或者我如何处理/解释 os.statvfs 数字有什么问题?

【问题讨论】:

  • os.statvfs[os.B_FILES] 的输出与您的预期有何不同? (如果您可以粘贴来自 os.statvfs 的示例输出并解释为什么它没有帮助,那将帮助不了解 OS X 的人帮助您)。
  • @Charles:我已经用一些实际细节更新了我的问题......
  • 您可以使用之前 rsync 运行中的数字。它快速、便携,对于 10**6 个文件和任何合理的备份策略,它都能为您提供 1% 或更高的精度。
  • @J.F.:完全正确!您应该将其作为实际答案发布,以便我给它 +1。

标签: python macos filesystems hard-drive


【解决方案1】:

对于您的目的,正确的答案是一次没有进度条,存储 rsync 得出的数字,并假设每次连续备份您拥有与上次相同数量的文件。

我不相信,但这似乎适用于 Linux:

os.statvfs('/').f_files - os.statvfs('/').f_ffree

这计算文件块的总数减去空闲文件块。即使您将其指向另一个目录,它似乎也显示了整个文件系统的结果。 os.statvfs 仅在 Unix 上实现。

好吧,我承认,在惊叹于快速方法之前,我实际上并没有让“缓慢、正确”的方法完成。只有几个缺点:我怀疑.f_files 也会计算目录,结果可能完全错误。它可能会以慢速方式计算文件一次,然后从“快速”方式调整结果?

便携方式:

import os
files = sum(len(filenames) for path, dirnames, filenames in os.walk("/"))

os.walk 为文件系统中从给定路径开始的每个目录返回一个 3 元组(目录路径、目录名、文件名)。 "/" 可能需要很长时间,但您已经知道了。

简单的方法:

让我们面对现实吧,没有人知道或关心他们真正拥有多少文件,这是一个单调乏味的统计数据。您可以使用以下代码将这个很酷的“文件数量”功能添加到您的程序中:

import random
num_files = random.randint(69000, 4000000)

让我们知道这些方法是否适合您。

另见How do I prevent Python's os.walk from walking across mount points?

【讨论】:

  • 这正是我预先尝试的,但结果数字对我来说没有意义。我已将上面的问题编辑得更具体。
【解决方案2】:

您可以使用之前rsync 运行中的数字。它快速、便携,对于10**6 文件和任何合理的备份策略,它都会为您提供1% 或更高的精度。

【讨论】:

  • @Sebastian:你早在 joeforker 之前就在评论中发布了这个,所以你得到了我的复选标记。
【解决方案3】:

如果可以选择遍历目录树(比直接查询驱动器要慢):

import os

dirs = 0
files = 0

for r, d, f in os.walk('/path/to/drive'):
  dirs += len(d)
  files += len(f)

【讨论】:

    【解决方案4】:

    编辑:Spotlight 不会跟踪每个文件,因此它的元数据是不够的。

    【讨论】:

    • 我很确定聚光灯不会影响你的整个音量。我认为它坚持 /Applications 和 /Users (并忽略 ~/Library 之类的东西)。
    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多