我根据我发现的其他答案给了它一个不错的尝试,但没有做任何可靠的事情(我的解决方案非常缓慢,但也许别无他法)。基本上,我有一个名为“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天的目录,只是想知道我是否可以使用此代码更改任何内容。
我是以错误的方式解决这个问题,是否有更简单的解决方案?有任何问题或其他任何问题让我知道,谢谢!
答案 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)