我需要知道pathA是pathB的子集,还是包含在pathB中。
我制作了一个小脚本,可以移动一些旧卷并查找重复文件。我的一般方法(即使它是一个糟糕的方法,效率低下,它只适合我而且它有效,所以我对它的蛮力很好)一直:
我希望能够排除某些目录(即系统文件)。这就是我写的:
#self.search_dir = top level directory to be searched for duplicates
#self.mfl = master_file_list, being built by this func, a list of all files in search_dir
#self.no_crawl_list = list of files and directories to be excluded from the search
def build_master_file_list(self):
for root, directories, files in os.walk(self.search_dir):
files = [f for f in files if not f[0] == '.']
directories[:] = [d for d in directories if not d[0] == '.']
for filename in files:
filepath = os.path.join(root, filename)
if [root, filepath] in self.no_crawl_list:
pass
else:
self.mfl.write(filepath + "\n")
self.mfl.close()
但我很确定这不会按照我的意图行事。我的目标是将所有子目录排除在self.no_crawl_list
之外,以便:
如果
/path/to/excluded_dir
已添加self.no_crawl_list
然后是/path/to/excluded_dir/sub_dir/implicitly_excluded_file.txt
也会被跳过。我认为我的代码目前完全是关于要跳过的内容。然而,如果没有对路径部分进行爆炸并将它们与self.no_crawl_list
中的每个可能组合进行比较,我就不知道如何做到这一点。 ' Lil帮忙? :)
答案 0 :(得分:1)
根据Lukas Graf在上述评论中的帮助,我能够构建它,它就像一个魅力:
def is_subpath(self, path, of_paths):
if isinstance(of_paths, basestring): of_paths = [of_paths]
abs_of_paths = [os.path.abspath(of_path) for of_path in of_paths]
return any(os.path.abspath(path).startswith(subpath) for subpath in abs_of_paths)
此外,目前这并不考虑符号链接并假定是UNIX文件系统,请参阅原始问题中的注释以获取有关扩展此问题的建议。