递归扫描文件夹并获取各目录最新atime的问题排查
递归获取目录及子目录最新访问时间(atime)解决方案
问题背景
现有文件夹结构如下:
myfolder/ myfolder/a/ myfolder/a/1/ myfolder/a/1/i.txt myfolder/a/1/ii.txt myfolder/a/1/iii.txt myfolder/a/2/ myfolder/a/2/i.txt myfolder/a/2/ii.txt myfolder/a/2/iii.txt myfolder/b/ myfolder/b/3/ myfolder/b/3/i.txt myfolder/b/3/ii.txt myfolder/b/3/iii.txt myfolder/b/4/ myfolder/b/4/i.txt myfolder/b/4/ii.txt myfolder/b/4/iii.txt
需求:递归扫描目录,获取每个目录及其下游所有文件的最新atime并打印,父目录需汇总自身文件及所有子目录的最新atime。
原代码运行后出现子目录最新atime比父目录更新的问题,核心原因是递归调用子目录时,未将子目录的统计结果同步到父目录的时间计算中。
原代码问题分析
原drill_directory函数处理子目录时,仅执行递归调用但未接收返回值,导致父目录只能统计自身文件的访问时间,完全忽略了子目录下的最新时间数据。
修正后的代码
import os import time def drill_directory(directory): most_recent = 0.0 # 可选:若需将目录自身的atime纳入统计,取消以下两行注释 # dir_atime = float(os.path.getatime(directory)) # most_recent = dir_atime for entry in os.listdir(directory): entry_path = os.path.join(directory, entry) if os.path.isfile(entry_path): atime = float(os.path.getatime(entry_path)) if atime > most_recent: most_recent = atime elif os.path.isdir(entry_path): # 接收子目录返回的最新atime,更新当前目录的统计值 sub_dir_recent = drill_directory(entry_path) if sub_dir_recent > most_recent: most_recent = sub_dir_recent # 转换为可读时间格式并打印 print(time.ctime(most_recent), directory) # 返回当前目录的最新atime,供父目录统计使用 return most_recent # 替换为你的目标目录路径 drill_directory('/Users/Admin/Downloads/')
关键改动说明
- 增加返回值:让
drill_directory函数返回当前目录及其子目录的最新atime,确保父目录能获取到子目录的统计结果。 - 同步子目录数据:处理子目录时,将递归调用返回的时间值与当前目录的
most_recent对比,更新为更大的时间值。 - 可选目录自身时间:如果需要把目录自身的访问时间也纳入统计范围,可取消代码中对应的注释行。
内容的提问来源于stack exchange,提问作者arlovande
相关产品推荐
相关产品推荐

