2012-07-31 214 views
3

我已經根據我發現的其他答案給了它一個體面的嘗試,但沒有管理任何固體(我的解決方案是可怕的緩慢,但也許沒有其他方式)。基本上,我有一個名爲「scratch」的文件夾,用戶可以在其中創建自己的文件夾來轉儲他們的數據。
我需要我的腳本來找出哪些用戶的文件夾已超過30天未被使用。我想我可以通過查找用戶文件夾中最近修改的目錄(通過遞歸搜索)來實現此目的,然後過濾掉較舊的目錄。如何在目錄(python)目錄中找到最近修改過的文件夾?

代碼來獲得用戶的目錄列表:

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

我會用:

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) 

調試maxValueError(把這個地方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))) 
+0

似乎要處理它,直到它找到具有某種權限的文件:WindowsError:[錯誤5]訪問被拒絕:'\\\\ abg-netapp1 \\ Scratch \\ user \\ file。任何想法如何忽略這些? – ashleh 2012-07-31 11:01:28

+0

@AshleyJohnKent稍微重新工作,包括異常處理 – 2012-07-31 11:17:04

+0

@AshleyJohnKent我能想到的唯一原因是,我在發佈的代碼中有一個錯字 - 「get_files」應該是'list_user_files' – 2012-07-31 11:51:48

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) 
+0

我需要找到在整個文件夾中的最近修改的目錄(即使這意味着它有10個文件夾,因此我使用os.walk來遞歸檢查每個文件夾)。 – ashleh 2012-07-31 10:23:42

+0

我意識到這一點,但你要求更好的方式,這就是我發佈的內容。只需相應地調整你的循環。 – 2012-07-31 10:26:32

相關問題