Python 用于查找和删除最旧文件的脚本,直到达到空闲 HDD space 阈值

Python script to find and delete oldest files until free HDD space threshold is met

我完全是 Python 的新手,尽管我已经进行了一些搜索(并找到了一些很好的答案),但我仍然无法获得本应包含的脚本正是这样做才能工作。也就是说,我希望脚本一个一个地删除给定目录中最旧的文件,直到达到 100GiB 可用 space 阈值。我目前收到以下错误:

  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

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

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

fstatvfs requires a file descriptor (as returned by file.fileno()), for a path name you want to use statvfs

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