0

我正在编写一个 python 程序来备份一系列监视目录中的文件。我正在使用看门狗来检测文件系统的更改。所提供的只是已更改文件和文件夹的列表。

该应用程序可以选择包含和排除文件夹列表,但我无法弄清楚如何匹配路径以查看是否应该排除或包含它们。

问题是当您有一棵树并且用户选择包含一个位于排除的文件夹内的文件夹时。

示例文件树

/folder1/folder2/folder3/folder4/folder5

包括

/folder1
/folder1/folder2/folder3/folder4

排除在外

/folder1/folder2

我曾考虑使用startswith() 来比较看门狗返回的字符串的路径部分的开头,但随后/folder1/folder2/folder3/folder4/folder5会匹配包含和排除文件夹列表。

如果有人可以提出解决此问题的最佳方法,我将不胜感激。如果我使用 os.walk 递归遍历目录,我可以让它轻松工作,但只是给出了一个我无法弄清楚如何去做的列表。它让我发疯。

4

3 回答 3

1

如果我明白你在说什么,你想优先考虑最嵌套的深度。所以包括在内'/folder1/folder2/folder3/folder4/folder5

我会将您的数据放入这样的查找表中:

lookup = {'/folder1/folder2/folder3/folder4':'include','/folder1/folder2':'exclude','/folder1':'include'}

然后只需以相反的顺序循环您的查询,一次剥离一个目录,直到您获得匹配项:

folder = '/folder1/folder2/folder3/folder4/folder5'.split('/')
for i in reversed(range(len(folder) + 1)):
    check = '/'.join(folder[:i])
    if lookup.get(check):
        print('{}: {}'.format(check,lookup.get(check)))
        break

#/folder1/folder2/folder3/folder4: include
于 2013-10-31T21:42:14.710 回答
0

假设一条路径f,如果我正确理解您的问题,这可能有效

f.startswith(tuple(includes)) and not f.startswith(tuple(excludes))
于 2013-10-31T21:31:57.813 回答
0

作为另一种可能性,应该适用于任何给定路径的操作(即包含或排除)是最具体的。因此,您可以通过将配置放置在如下结构中来解决问题:

rules = [("/folder1", "include"), ("/folder1/folder2/...", "exclude"), ...]

然后,您可以使用以下函数确定对给定路径应用哪个操作:

def get_action(path, rules):
    action = None
    depth = None
    for filter, filter_action in rules:
        if path.startswith(filter):
            filter_depth = filter.count(os.sep)
            if depth is None or filter_depth > depth:
                depth = filter_depth
                action = filter_action
    return action

然后,这将返回操作,即“包含”或“排除”,或者如果没有为路径定义规则None。我给出的定义相当低效,有很多方法可以改进,但基本思想是为给定路径寻找最具体的规则并遵循该操作。

于 2013-10-31T22:42:22.707 回答