python - 在整个磁盘中删除最旧的文件

标签 python wrapper

将数据以 100MB block 写入磁盘并通过附加 +1 递增文件名的应用程序,因此 n1, n2 ... n1000。这最终会使用分区(Linux 主机)上的所有可用空间。我正在寻找一种方法来删除系列中首次写入的文件,直到驱动器空间达到特定利用率。

如果是后者,会https://stackoverflow.com/a/5912404/666891是一个好的解决方案吗?

提出了以下解决方案,根据 https://stackoverflow.com/a/837840/666891 看来这是一个可行的解决方案.如何修改它以处理递增的文件扩展名,因为当前运行脚本时它不会删除文件名文件名*,星号是递增的数字,从最旧的开始?

import os
def free_space_up_to(free_bytes_required="161061273600", rootfolder="/data/", ex
tension="filename-*"):
    file_list= files_to_delete(rootfolder, extension)
    while file_list:
        statv= os.statvfs(rootfolder)
        if statv.f_bfree*statv.f_bsize >= free_bytes_required:
            break
        os.remove(file_list.pop())

最佳答案

好吧,如果您知道所有文件的大小(至少是某种程度)为 100MB,并且假设机器上的磁盘使用情况没有发生其他任何显着变化,则您无需在每次迭代时都检查可用空间。

此外,如果所有文件都具有相同的名称,除了末尾的计数器之外,您可以跳过 os.stat 调用(这对于快速连续创建的文件也可能无用)并根据计数器对文件名进行排序:

import os

def free_space_up_to(free_bytes_required=161061273600, rootfolder="/data/", filesize=104857600, basename="filename-"):
    '''Deletes rootfolder/basename*, oldest first, until there are free_bytes_required available on the partition.
    Assumes that all files have file_size, and are all named basename{0,1,2,3,...}
    Returns number of deleted files.
    '''
    statv = os.statvfs(rootfolder)
    required_space = free_bytes_required - statv.f_bfree*statv.f_bsize
    basepath = os.path.join(rootfolder, basename)
    baselen = len(basepath)
    if required_space <= 0:
        return 0

    # "1 +" here for quickly rounding
    files_to_delete = 1 + required_space/filesize

    # List all matching files. If needed, replace with os.walk for recursively
    # searching into subdirectories of rootfolder
    file_list = [os.path.join(rootfolder, f) for f in os.listdir(rootfolder)
                 if f.startswith(basename)]

    file_list.sort(key=lambda i: int(i[baselen:]), reverse=True)
    # Alternatively, if the filenames can't be trusted, sort based on modification time
    #file_list.sort(key=lambda i: os.stat(i).st_mtime)

    for f in file_list[:files_to_delete]:
        os.remove(f)
    return files_to_delete

(没有经过全面测试,我建议用“print”代替“os.remove”进行测试;))

关于python - 在整个磁盘中删除最旧的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815661/

相关文章:

python - 传入 session 时 Tensorflow Multiprocessing pickle rlock 错误

python - 随机选择: how can I get a weighted presentation for x trials?

python - python中的反向排序和argsort

python - Pyglet,播放完所有声音后退出

python - 基于边缘属性/权重的图论距离度量和其他度量

C++:是否必须将策略放入包装器以避免裸露的新/删除?

C++ lib dll 的 C# 包装器类

c++ - 如何解决这个错误 ":(.text+0x4d): undefined reference to ` _imp___ZN10Management11OpenEm'"

java/jackson - 不要序列化包装类

java - 为什么ArrayList能够去掉这个呢?