3

私が見つけた他の答えに基づいてそれをまともな試みをしましたが、しっかりしたものは何も管理していません(私の解決策は恐ろしく遅いですが、他の方法はないかもしれません)。基本的に、私は「スクラッチ」と呼ばれるフォルダを持っており、ユーザーはそこに独自のフォルダを作成してデータをダンプできます。
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 ValueErrormost_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 に答える