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


5

我一直在试图弄清楚如何检索(快速)与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数字有什么问题?

  0

os.statvfs [os.B_FILES]的输出如何与您期望的不同? (如果你可以粘贴来自os.statvfs的示例输出,并解释*为什么*这没有帮助,那可以帮助那些不了解OS X的人帮助你)。 22 2月. 092009-02-22 03:54:25

  0

@Charles:我已经用一些实际的细节更新了我的问题... 24 2月. 092009-02-24 17:08:29

  0

您可以使用之前rsync运行中的一个数字。它快速,便携,并且对于10 ** 6个文件和任何合理的备份策略,它会给你1%或更高的精度。 24 2月. 092009-02-24 18:25:49

  0

@ J.F .:很对!您应该将其作为实际答案发布,以便我可以给它+1。 24 2月. 092009-02-24 21:17:32

2

你可以使用一个号码从以前rsync运行。它是快速,便携,并为10**6文件和任何合理的备份策略,它会给你1%或更好的精度。

  0

@塞巴斯蒂安:你在joeforker之前很久就发布了这个评论,所以你会从我这里得到对号。 26 2月. 092009-02-26 18:27:55


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中,文件名)。对于"/"这可能需要很长时间,但您已经知道了。

最简单的办法:

让我们面对它,没有人知道或关心他们有多少个文件真的有,这是一个单调和多少价值统计数字。您可以使用此代码将这个很酷的“文件数量”功能添加到您的程序中:

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

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

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

  0

这正是我在前面尝试的,但结果编号对我来说没有意义。我已经编辑了上面的问题,以便更具体。 24 2月. 092009-02-24 17:09:01

  0

哈哈,我喜欢随机评论中的幽默。 31 10月. 092009-10-31 01:56:43


0

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

  0

我很确定聚光灯不会走遍你的整卷。我认为它坚持/应用程序和/用户(并忽略像〜/库这样的东西)。 23 2月. 092009-02-23 01:09:29


1

如果遍历目录树是一种选择(会比直接查询驱动慢):

import os 

dirs = 0 
files = 0 

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