【问题标题】:Python script to find and delete oldest files until free HDD space threshold is met用于查找和删除最旧文件的 Python 脚本,直到满足可用硬盘空间阈值
【发布时间】:2015-03-12 01:33:08
【问题描述】:

我对 Python 绝对是全新的,虽然我已经做了一些搜索(并且找到了一些好的答案),但我仍然无法获得一个应该完全做到这一点的脚本。也就是说,我希望脚本一个一个地删除给定目录中最旧的文件,直到达到 100GiB 可用空间阈值。我目前收到以下错误:

  File "./freespace.py", line 18, in <module>
    free_space_up_to(107374182400, "/home/hindenpeter/Downloads/")
  File "./freespace.py", line 13, in free_space_up_to
    statv=os.fstatvfs(rootfolder)
TypeError: an integer is required

尝试运行此脚本时:

#!/usr/bin/python2.7

import os
def files_to_delete(rootfolder):
    return sorted(
        (os.path.join(dirname, filename)
         for dirname, dirnames, filenames in os.walk(rootfolder)
         for filename in filenames),
            key=lambda fn: os.stat(fn).st_mtime),reversed==True
def free_space_up_to(free_bytes_required, rootfolder):
    file_list=files_to_delete(rootfolder)
    while file_list:
        statv=os.fstatvfs(rootfolder)
        if statv.f_bfree*statv.f_bsize >= free_bytes_required:
            break
        os.remove(file_list.pop())

free_space_up_to(107374182400, "/home/hindenpeter/Downloads/")

所以我正在寻求帮助以使其正常工作(另外,错误的确切含义的翻译会很棒!),或者可能是一个全新的脚本,可以做我想做的事情。

作为参考,这些是我发现的与我的问题最相关的帖子: Delete oldest files at full disk Find the oldest file (recursively) in a directory

【问题讨论】:

  • 显然路径不存在时抛出错误
  • 是的,事实证明我应该一直使用 os.statvfs,正如 Yann 建议的那样。

标签: python file python-2.7 delete-file


【解决方案1】:

fstatvfs 需要一个文件描述符(由file.fileno() 返回),用于您要使用statvfs 的路径名。

【讨论】:

  • 啊,完美!这似乎工作得很好!非常感谢您的及时答复。
【解决方案2】:

这里的问题是fstatvfs文件描述符(一个整数)作为参数,而不是路径。您应该首先在路径上调用open,然后将生成的对象的描述符(通过fileno() 方法)传递给fstatvfs

另外,另一个不需要首先获取文件描述符并且可以直接使用路径的选项是调用os.stat。然后,您需要查看 st_size 属性。

【讨论】:

  • 打开目录没那么容易; os.open(path, os.O_RDONLY, os.O_DIRECTORY) 可以在某些 GNU 系统上执行此操作,但这样做的主要原因是避免在移动或删除目录时出错。
  • 你会调用open来获取file对象,在该对象上调用fileno,对吧?
  • 目录与普通文件不同,许多系统不允许你以同样的方式打开它们(你会得到“是一个目录”错误)。 O_DIRECTORY 标志是一个 GNU 扩展,表示您确实想要打开一个目录。标准方法是调用 opendir(),AFAIK 在 Python 的标准库中不存在。由于打开一个最常见的原因是列出其内容,因此我们有 os.listdir 和 os.walk 以便于访问。
  • 啊,好的。是的,我可能会使用os.walk 递归地获取目录中每个单独文件的大小并将它们汇总,而不是尝试从目录本身获取元数据。
  • 这样就可以得到目录的磁盘使用情况;问题是关于可用空间,其中需要文件系统统计信息。 statvfs 是正确的选择。
【解决方案3】:

经过一些测试,当指定路径不存在时,os.fstatvfs 会抛出此错误。这与文件描述符的内部需求相一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 2014-09-12
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多