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

时间:2009-02-22 03:12:46

标签: python macos filesystems hard-drive

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

我一直在玩os.statvfs等等,但不能得到任何东西(这对我来说似乎有帮助)。

有什么想法吗?

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

由于各种原因,我正在为rsync编写一个类似timemachine的包装器,并希望对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数字有什么问题?

4 个答案:

答案 0 :(得分: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)

如果这些方法中的任何一种适合您,请告诉我们。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

import os

dirs = 0
files = 0

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

答案 3 :(得分:0)

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