Row*_*ker 10 python linux file-io
我正在编写Python备份脚本,我需要在目录(及其子目录)中找到最旧的文件.我还需要将其过滤为*.avi文件.
该脚本将始终在Linux计算机上运行.有没有办法在Python中执行它或运行一些shell命令更好?
目前我正在运行df以获得特定分区上的可用空间,如果可用空间少于5千兆字节,我想开始删除最旧的*.avi文件,直到满足该条件.
tzo*_*zot 23
嗯.纳迪亚的回答更接近你的意思 ; 但是,要查找树中的(单个)最旧文件,请尝试以下操作:
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)
Run Code Online (Sandbox Code Playgroud)
稍加修改,您就可以获得n最旧的文件(类似于Nadia的答案):
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)
Run Code Online (Sandbox Code Playgroud)
请注意,使用该.endswith方法允许调用:
oldest_files_in_tree("/home/user", 20, (".avi", ".mov"))
Run Code Online (Sandbox Code Playgroud)
选择多个扩展名.
最后,如果您想要按修改时间排序的完整文件列表,以便删除尽可能多的空闲空间,这里有一些代码:
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)
Run Code Online (Sandbox Code Playgroud)
并注意,reverse=True将最旧的文件放在列表的末尾,以便下一个要删除的文件,您只需执行file_list.pop().
顺便说一下,为了完整解决您的问题,因为您在Linux上运行,所以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())
Run Code Online (Sandbox Code Playgroud)
statvfs.f_bfree是设备空闲块,statvfs.f_bsize是块大小.我们采用rootfolderstatvfs,因此请注意指向其他设备的任何符号链接,我们可以删除许多文件而不会实际释放此设备中的空间.
更新(由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)
dF.*_*dF. 13
要在Python中执行此操作,您可以使用os.walk(path)递归遍历文件,并使用st_size和st_mtime属性os.stat(filename)来获取文件大小和修改时间.
Nad*_*mli 10
ST_MTIME参考最后修改时间.如果需要,您可以选择其他值
import os, stat, fnmatch
file_list = []
for filename in os.listdir('.'):
if fnmatch.fnmatch(filename, '*.avi'):
file_list.append((os.stat(filename)[stat.ST_MTIME], filename))
Run Code Online (Sandbox Code Playgroud)
然后您可以按时间排序列表并根据它进行删除.
file_list.sort(key=lambda a: a[0])
Run Code Online (Sandbox Code Playgroud)
我认为最简单的方法是使用find和ls -t(按时间排序文件).
沿着这些行的东西应该做的伎俩(删除指定目录下最旧的avi文件)
find / -name "*.avi" | xargs ls -t | tail -n 1 | xargs rm
Run Code Online (Sandbox Code Playgroud)
一步步....
find/-name"*.avi" - 从根目录开始递归查找所有avi文件
xargs ls -t - 对修改时间找到的所有文件进行排序,从最新到最旧.
tail -n 1 - 抓取列表中的最后一个文件(最旧的)
xargs rm - 并删除它
| 归档时间: |
|
| 查看次数: |
13271 次 |
| 最近记录: |