使用 os.walk() 检索特定目录

Retrieving specific directories using os.walk()

我有一组作业(job1job2 等)每小时运行一次,完成后生成文件夹(session1session2 等)其中包含日志文件。由于存储限制,我需要一个脚本,它可以删除早于设定时间限制的会话目录,但也想指定它必须保留指定数量的会话目录,例如保留最新的 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]: