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 天的目录,只是想看看我是否可以用这段代码更改任何内容。
我是不是走错了路,有没有更简单的解决方案?有什么问题或者其他什么都可以告诉我,谢谢!

4

2 回答 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)))
于 2012-07-31T10:48:49.990 回答
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)
于 2012-07-31T10:18:12.753 回答