如何在目录(python)目录中找到最近修改过的文件夹?

时间:2012-07-31 09:59:09

标签: python directory

我根据我发现的其他答案给了它一个不错的尝试,但没有做任何可靠的事情(我的解决方案非常缓慢,但也许别无他法)。基本上,我有一个名为“scratch”的文件夹,用户可以在其中创建自己的文件夹来转储数据 我需要我的脚本来找出超过30天没有使用哪个用户的文件夹。我想我可以通过在users文件夹中找到最近修改过的目录(通过递归搜索)然后过滤掉较旧的目录来做到这一点。

获取用户目录列表的代码:

    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 个答案:

答案 0 :(得分: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)))

答案 1 :(得分: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)