使用 os.walk() 检索特定目录
Retrieving specific directories using os.walk()
我有一组作业(job1
、job2
等)每小时运行一次,完成后生成文件夹(session1
、session2
等)其中包含日志文件。由于存储限制,我需要一个脚本,它可以删除早于设定时间限制的会话目录,但也想指定它必须保留指定数量的会话目录,例如保留最新的 2 个会话,即使它们早于设置时间限制。
如何使用 python os.walk()
实现此目的?我想 return 要删除的会话目录列表 sessions_to_delete = []
/root
/job1 (runs every one hour)
/session1
/*log
/session2
/session3
/job2
/session1
/session2
在这种情况下,使用 glob.glob()
, to match your hierarchy pattern. You can use os.path.getctime()
列出所有目录以获得每个目录的时间戳以按
排序和过滤可能更容易
from glob import glob
import os.path
import time
def find_sessions_to_delete(cutoff):
# produce a list of (timestamp, path) tuples for each session directory
session_dirs = [(os.path.getctime(p), p) for p in glob('/root/job*/session*')]
session_dirs.sort(reverse=True) # sort from newest to oldest
# remove first two elements, they are kept regardless
session_dirs = session_dirs[2:]
# return a list of paths whose ctime lies before the cutoff time
return [p for t, p in session_dirs if t <= cutoff]
cutoff = time.time() - (7 * 86400) # 7 days ago
sessions_to_delete = find_sessions_to_delete(cutoff)
我在 7 天前包含了一个示例截止日期,根据 time.time()
计算得出,其中 returns 一个整数值,表示自 1970 年 1 月 1 日(UNIX 纪元)以来经过的秒数).
如果您需要每个作业目录执行此操作,请对每个此类目录执行相同的工作并合并结果列表:
def find_sessions_to_delete(cutoff):
to_delete = []
# process each jobdir separately
for jobdir in glob('/root/job*'):
# produce a list of (timestamp, path) tuples for each session directory
session_dirs = [(os.path.getctime(p), p)
for p in glob(os.path.join(jobdir, 'session*'))]
session_dirs.sort(reverse=True) # sort from newest to oldest
# remove first two elements, they are kept regardless
session_dirs = session_dirs[2:]
# Add list of paths whose ctime lies before the cutoff time
to_delete.extend(p for t, p in session_dirs if t <= cutoff)
return to_delete
您可以使用 os.path.getatime(路径) 或 os.path.getmtime(路径) 来弄清楚 "old" 是一个文件夹,然后用它做您需要做的事情...
这里是关于 os.path 模块的基本信息 https://docs.python.org/2/library/os.path.html#module-os.path
解决您的问题的一种方法可能是:
import os
import time
for folder in list_of_folders:
if time.time() - os.path.getmtime(folder) > time_limit:
delete_folder(folder)
如果您使用 append() 构建 list_of_folders,那么您可以通过像这样轻松更改 for 循环来保存最后两个文件夹。
for folder in list_of_folders[:-2]:
我有一组作业(job1
、job2
等)每小时运行一次,完成后生成文件夹(session1
、session2
等)其中包含日志文件。由于存储限制,我需要一个脚本,它可以删除早于设定时间限制的会话目录,但也想指定它必须保留指定数量的会话目录,例如保留最新的 2 个会话,即使它们早于设置时间限制。
如何使用 python os.walk()
实现此目的?我想 return 要删除的会话目录列表 sessions_to_delete = []
/root
/job1 (runs every one hour)
/session1
/*log
/session2
/session3
/job2
/session1
/session2
在这种情况下,使用 glob.glob()
, to match your hierarchy pattern. You can use os.path.getctime()
列出所有目录以获得每个目录的时间戳以按
from glob import glob
import os.path
import time
def find_sessions_to_delete(cutoff):
# produce a list of (timestamp, path) tuples for each session directory
session_dirs = [(os.path.getctime(p), p) for p in glob('/root/job*/session*')]
session_dirs.sort(reverse=True) # sort from newest to oldest
# remove first two elements, they are kept regardless
session_dirs = session_dirs[2:]
# return a list of paths whose ctime lies before the cutoff time
return [p for t, p in session_dirs if t <= cutoff]
cutoff = time.time() - (7 * 86400) # 7 days ago
sessions_to_delete = find_sessions_to_delete(cutoff)
我在 7 天前包含了一个示例截止日期,根据 time.time()
计算得出,其中 returns 一个整数值,表示自 1970 年 1 月 1 日(UNIX 纪元)以来经过的秒数).
如果您需要每个作业目录执行此操作,请对每个此类目录执行相同的工作并合并结果列表:
def find_sessions_to_delete(cutoff):
to_delete = []
# process each jobdir separately
for jobdir in glob('/root/job*'):
# produce a list of (timestamp, path) tuples for each session directory
session_dirs = [(os.path.getctime(p), p)
for p in glob(os.path.join(jobdir, 'session*'))]
session_dirs.sort(reverse=True) # sort from newest to oldest
# remove first two elements, they are kept regardless
session_dirs = session_dirs[2:]
# Add list of paths whose ctime lies before the cutoff time
to_delete.extend(p for t, p in session_dirs if t <= cutoff)
return to_delete
您可以使用 os.path.getatime(路径) 或 os.path.getmtime(路径) 来弄清楚 "old" 是一个文件夹,然后用它做您需要做的事情... 这里是关于 os.path 模块的基本信息 https://docs.python.org/2/library/os.path.html#module-os.path
解决您的问题的一种方法可能是:
import os
import time
for folder in list_of_folders:
if time.time() - os.path.getmtime(folder) > time_limit:
delete_folder(folder)
如果您使用 append() 构建 list_of_folders,那么您可以通过像这样轻松更改 for 循环来保存最后两个文件夹。
for folder in list_of_folders[:-2]: