我有这样的备份目录结构(所有目录都不为空):
/home/backups/mysql/
2012/
12/
15/
2013/
04/
29/
30/
05/
02/
03/
04/
05/
我希望通过仅提供根目录路径来获取包含备份的所有目录的列表:
get_all_backup_paths('/home/backups/mysql', level=3)
这应该返回:
/home/backups/mysql/2012/12/15
/home/backups/mysql/2013/04/29
/home/backups/mysql/2013/04/30
/home/backups/mysql/2013/05/02
/home/backups/mysql/2013/05/03
/home/backups/mysql/2013/05/04
/home/backups/mysql/2013/05/05
不应该 出现在结果中:
/home/backups/mysql/2012
/home/backups/mysql/2012/12
/home/backups/mysql/2013
/home/backups/mysql/2013/04
/home/backups/mysql/2013/05
有没有办法让os.listdir
3级降低,排除所有其他级别?如果是的话,我会恭喜你的帮助。
def get_all_backup_paths(dir, level):
# ????
答案 0 :(得分:6)
from glob import iglob
level3 = iglob('/home/backups/mysql/*/*/*')
(这将跳过名称以.
开始的“隐藏”目录)
如果级别3可能存在非目录,请使用以下命令跳过它们:
from itertools import ifilter
import os.path
l3_dirs = ifilter(os.path.isdir, level3)
在Python 3中,使用filter
代替ifilter
。
答案 1 :(得分:3)
您可以使用glob
搜索目录树,如下所示:
import os, glob
def get_all_backup_paths(dir, level):
pattern = dir + level * '/*'
return [d for d in glob.glob(pattern) if os.path.isdir(d)]
我还包括对目录的检查,以防可能存在与目录混合的文件。
答案 2 :(得分:0)
导入functools,os
def deepdirs(directory, depth = 0):
if depth == 0:
return list(filter(os.path.isdir, [os.path.join(directory, d) for d in os.listdir(directory)]))
else:
return functools.reduce(list.__add__, [deepdirs(d) for d in deepdirs(directory, depth-1)], [])