将数据以 100MB 块的形式写入磁盘并通过附加 +1 来增加文件名的应用程序,因此 n1, n2 ... n1000
。这最终会使用分区(Linux 主机)上的所有可用空间。我正在寻找一种方法来删除系列中首次写入的文件,直到驱动器空间处于特定利用率。
如果是后者,https://stackoverflow.com/a/5912404/666891 会是一个很好的解决方案吗?
提出了以下解决方案,并且看起来是每个 https://stackoverflow.com/a/837840/666891 的可行解决方案。如何修改它以处理当前递增的文件扩展名,当脚本运行时它不会删除文件名 filename*,星号是递增的数字,从最旧的开始?
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/