栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在目录中查找最旧的文件(递归)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在目录中查找最旧的文件(递归)

嗯 Nadia的答案是接近你什么 意思 要问; 但是,要在树中找到(单个)最旧的文件,请尝试以下操作:

import osdef 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的答案):

import os, heapqdef 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
方法允许调用为:

oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))

选择多个扩展名。

最后,如果您想要按修改时间排序的完整文件列表,以便根据需要删除尽可能多的文件以释放空间,请使用以下代码:

import osdef 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()

顺便说一句,为了完全解决您的问题,由于您正在Linux上运行(如果有

os.statvfs
),您可以执行以下操作:

import osdef 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
是块大小。我们使用
rootfolder
statvfs,因此请注意指向其他设备的任何符号链接,我们可以在其中删除许多文件而无需实际释放此设备中的空间。

更新(复制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




转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412316.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号