如何在一个包含多个文件夹的目录中找到最近修改的文件夹(Python)?

3
基于我发现的其他答案,我已经做出了相当努力的尝试,但没有找到可靠的解决方案(我的解决方案非常缓慢,但也许没有其他方法)。基本上,我有一个名为“scratch”的文件夹,用户可以在其中创建自己的文件夹来存储数据。
我需要我的脚本找出哪些用户的文件夹已经超过30天没有使用了。我想我可以通过在用户文件夹中查找修改时间最近的目录(通过递归搜索)然后过滤掉旧的目录来实现这一点。
代码以获取用户目录列表:
    dirlist = list()
    for filename in os.listdir("\\\\abg-netapp1\\Scratch\\"):
        dirlist.append(filename)

然后我可以遍历'dirlist'的每个索引,创建要搜索的完整路径:

    x=0
    for item in dirlist:
        max_mtime = 0
        for dirname,subdirs,files in os.walk("\\\\abg-netapp1\\Scratch\\" + dirlist[x]):
            for fname in subdirs:
                full_path = os.path.join(dirname, fname)
                mtime = os.stat(full_path).st_mtime
                if mtime > max_mtime:
                    max_mtime = mtime
                    max_dir = dirname
                    max_file = fname
        print max_dir, max_file, time.strftime('%Y-%m-%d', time.localtime(max_mtime))
        x+=1

我知道我还没有过滤掉30天前的目录,只是想看看是否有什么可以改变这段代码的方法。
我这样做错了吗?有更简单的解决方案吗?如果有任何问题,请告诉我,谢谢!

2个回答

2

我会使用:

import os
from os.path import join
from datetime import datetime, timedelta
from operator import itemgetter


def list_user_files(username):
    for root, dirs, files in os.walk(username):
        for name in files:
            fullname = join(root, name)
            try:
                yield fullname, os.stat(fullname).st_mtime
            except (IOError, OSError) as e: # will catch WindowsError but more generic
                pass # Do something here...


ROOT = '/home'
CUTOFF = timedelta(days=30)
for userdir in os.listdir(ROOT):
    most_recent = max(list_user_files(join(ROOT, userdir)), key=itemgetter(1))
    print '{}: most recent file and timestamp is {}'.format(userdir, most_recent)
    if (datetime.now() - datetime.fromtimestamp(most_recent[1])) > CUTOFF:
        print '{} has not used their folder during cutoff period'.format(userdir)

调试 max ValueError (将其放在 most_recent= 行的位置):

try:
    most_recent = max(list_user_files(join(ROOT, userdir)), key=itemgetter(1))
except ValueError as e:
    print '***DEBUG***', list(list_user_files(join(ROOT, userdir)))

似乎一直工作到找到某些权限的文件为止:WindowsError: [Error 5] Access is denied: '\\abg-netapp1\Scratch\user\file。有什么办法可以忽略这些文件吗? - ashleh
@AshleyJohnKent 我稍微重新调整了一下,并加入了异常处理。 - Jon Clements
@AshleyJohnKent 我能想到的唯一原因是我在发布的代码中打错了字 - get_files 应该是 list_user_files - Jon Clements
我已经注意到了,所以我不相信那是原因! - ashleh
好的,那么...捕获异常,然后运行 list(list_user_files(join(ROOT, userdir)) 看看有什么... - Jon Clements
1
@AshleyK 请查看修改后的答案以获取说明。 - Jon Clements

0

首先创建一个目录列表,然后按照 st_mtime 进行排序。

>>> root_path = '/foo/bar/zoo/'
>>> l = [fname for fname in os.listdir(root_path) if os.path.isdir(os.path.join(root_path,fname))]
>>> sorted(l,key=lambda x: os.stat(os.path.join(root_path,x)).st_mtime)

我需要在整个文件夹中找到最近修改的目录(即使这意味着它在10个文件夹下,因此我使用os.walk递归检查每个文件夹)。 - ashleh
我知道你已经意识到了,但是你要求一个更好的方法,那就是我发布的。只需相应地调整您的循环即可。 - Burhan Khalid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接