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

时间:2015-02-04 12:06:09

标签: python os.walk

我有一组作业(job1job2等)每小时运行一次,完成后会生成包含文件夹(session1session2等)的文件夹日志文件。由于存储限制,我需要一个脚本,可以删除早于设定时间限制的会话目录,但也要指定它必须保持指定数量的会话目录,例如保留最新的2个会话,即使它们比设置的旧时间限制。

如何使用python os.walk()实现此目的?我想返回会话目录列表以删除sessions_to_delete = []

/root    
    /job1             (runs every one hour)    
        /session1
            /*log
        /session2
        /session3
    /job2
        /session1
        /session2

2 个答案:

答案 0 :(得分:1)

在这种情况下,使用glob.glob()列出所有目录可能更容易,以匹配您的层次结构模式。您可以使用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()计算得出,它返回一个整数值,表示自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

答案 1 :(得分:1)

你可以使用os.path.getatime(path)或os.path.getmtime(path)来弄清楚“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]: