2

我有这样的备份目录结构(所有目录都不为空):

/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):
    # ????
4

3 回答 3

9
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.

于 2013-05-29T09:55:36.223 回答
5

您可以使用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)]

我还包括了对目录的检查,以防目录中混入了文件。

于 2013-05-29T09:57:23.130 回答
0

导入功能工具,操作系统

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)], [])
于 2013-05-29T10:15:30.177 回答