我正在编写一个Python备份脚本,需要在目录(及其子目录)中找到最旧的文件。我还需要仅将其过滤为* .avi文件。
该脚本将始终在Linux计算机上运行。有什么方法可以在Python中完成,还是运行一些Shell命令会更好?
目前,我正在df努力获取特定分区上的可用空间,如果可用空间不足5 GB,我想开始删除最旧的*.avi文件,直到满足该条件为止。
df
*.avi
嗯 Nadia的答案是接近你什么 意思 要问; 但是,要在树中找到(单个)最旧的文件,请尝试以下操作:
import os def oldest_file_in_tree(rootfolder, extension=".avi"): return min( (os.path.join(dirname, filename) for dirname, dirnames, filenames in os.walk(rootfolder) for filename in filenames if filename.endswith(extension)), key=lambda fn: os.stat(fn).st_mtime)
稍作修改,就可以得到n最旧的文件(类似于Nadia的答案):
n
import os, heapq def oldest_files_in_tree(rootfolder, count=1, extension=".avi"): return heapq.nsmallest(count, (os.path.join(dirname, filename) for dirname, dirnames, filenames in os.walk(rootfolder) for filename in filenames if filename.endswith(extension)), key=lambda fn: os.stat(fn).st_mtime)
请注意,使用该.endswith方法允许调用为:
.endswith
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
选择多个扩展名。
最后,如果您想要按修改时间排序的完整文件列表,以便根据需要删除尽可能多的文件以释放空间,请使用以下代码:
import os def files_to_delete(rootfolder, extension=".avi"): return sorted( (os.path.join(dirname, filename) for dirname, dirnames, filenames in os.walk(rootfolder) for filename in filenames if filename.endswith(extension)), key=lambda fn: os.stat(fn).st_mtime), reverse=True)
并注意,reverse=True最早的文件位于列表的末尾,因此对于下一个要删除的文件,只需执行即可file_list.pop()。
reverse=True
file_list.pop()
顺便说一句,为了完全解决您的问题,由于您正在Linux上运行(如果有os.statvfs),您可以执行以下操作:
os.statvfs
import os def free_space_up_to(free_bytes_required, rootfolder, extension=".avi"): 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())
statvfs.f_bfree是设备可用块,statvfs.f_bsize是块大小。我们使用rootfolderstatvfs,因此请注意指向其他设备的任何符号链接,我们可以在其中删除许多文件而无需实际释放此设备中的空间。
statvfs.f_bfree
statvfs.f_bsize
rootfolder
更新(复制Juan的评论):
根据操作系统和文件系统的实现,您可能希望将f_bfree乘以f_frsize而不是f_bsize。在某些实现中,后者是首选的I / O请求大小。例如,在我刚刚测试的FreeBSD 9系统上,f_frsize为4096,f_bsize为16384。POSIX说,块计数字段是“以f_frsize为单位”(请参见http://pubs.opengroup.org/onlinepubs/9699919799// basedefs / sys_statvfs.h.html)