如何使用Python确定驱动器上文件数量?

5

我一直在试着用Python快速检索给定HFS+驱动器上文件的数量,但一直没有找到合适的方法。

我已经尝试过使用os.statvfs等方法,但似乎没有取得任何对我有帮助的结果。

您有什么建议吗?

编辑:让我再具体些。

我正在为rsync编写类似Time Machine的包装器,出于各种原因,我需要非常快速地估算(无需完美)rsync将要扫描的驱动器上的文件数。这样,我就可以从rsync中观察进度(如果您像这样调用它: rsync -ax --progress,或者使用-P选项),当它构建初始文件列表时,向用户报告百分比和/或预计剩余时间(ETA)。

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

我已经尝试使用os.statvfs,正如迄今为止一个答案中描述的方法一样,但结果对我来说毫无意义。

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

更加便携的方法在这台机器上可以给我约1.1百万,这与我在这台机器上看到的所有其他指标相同,包括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 Duffy
@Charles:我现在已经更新了我的问题,并添加了一些实际细节... - Mike Boers
你可以使用之前rsync运行的数字。它快速,便携,对于10 ** 6个文件和任何合理的备份策略,它将为您提供1%或更好的精度。 - jfs
@J.F.:非常正确!您应该将其发布为实际答案,这样我就可以给它一个+1。 - Mike Boers
4个回答

7

针对您的需求,最好的方法是在一次备份中不使用进度条,记录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元组(dirpath,dirnames,filenames),对于给定路径开始的文件系统中的每个目录。对于"/"这样的根目录,这可能需要很长时间,但您已经知道了。

简单方法:

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

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

如果这些方法中有任何一种对您有用,请告诉我们。

另请参阅如何防止Python的os.walk跨越挂载点?


这正是我之前尝试的,但结果数字对我来说没有意义。我已经编辑了上面的问题以更具体。 - Mike Boers

2

您可以使用之前 rsync 运行的数字。这是一种快速、便携且对于 10**6 个文件和任何合理的备份策略,它将给您 1% 或更高的精度。


@Sebastian:你在joeforker之前就在评论区发布了这个,所以我会给你打勾。 - Mike Boers

1
如果遍历目录树是一个选项(会比直接查询驱动器慢):
import os

dirs = 0
files = 0

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

0

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


我很确定聚焦搜索不会遍历您整个卷。我认为它只会停留在 /Applications 和 /Users 目录(忽略类似于 ~/Library 的东西)。 - John Fouhy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接