为了安全起见,我有一些 bash 代码将文件和目录移动到/tmp/rmf
而不是删除它们。
我正在将代码迁移到 Python 以添加一些功能。添加的功能之一是检查可用大小/tmp
并断言移动的目录可以适合/tmp
.
使用os.statvfs检查可用空间,但如何测量移动目录的磁盘使用情况?
我可以调用du
using subprocess
,也可以递归地遍历目录树并对每个文件的大小求和。哪种方法会更好?
为了安全起见,我有一些 bash 代码将文件和目录移动到/tmp/rmf
而不是删除它们。
我正在将代码迁移到 Python 以添加一些功能。添加的功能之一是检查可用大小/tmp
并断言移动的目录可以适合/tmp
.
使用os.statvfs检查可用空间,但如何测量移动目录的磁盘使用情况?
我可以调用du
using subprocess
,也可以递归地遍历目录树并对每个文件的大小求和。哪种方法会更好?
我认为您可能需要重新考虑您的策略。两个原因:
检查您是否可以移动文件,断言您可以移动文件,然后移动文件为操作提供了内置的竞争条件。在您声明之后但在您移动文件之前,在 /tmp/ 中创建了一个大文件.. Doh。
跨文件系统移动文件将导致大量开销。这就是为什么在 OSX 上每个卷都有自己的“垃圾”目录。您只需创建一个指向现有数据的新 inode,而不是移动组成文件的块。
我会考虑文件需要可用多长时间以及文件消费者的可见性。如果这一切都是在后端发生的自动化事情 - 在大多数情况下,重命名文件以“隐藏”它对计算机和人类消费者来说很容易,并且具有作为原子操作的额外好处)
偶尔扫描文件系统中的“旧”文件以在一些宽限期后剔除和 rm 它们。没有剧情。也使恢复文件更容易,因为它只是一个重命名来恢复。
这应该可以解决问题:
import os
path = 'THE PATH OF THE DIRECTORY YOU WANT TO FETCH'
os.statvfs(path)