os.walk 第一次找到后停止查找子目录

os.walk stop looking on subdirectories after first finding

我需要获取目录中 repository.config 文件的首次出现,并停止在子目录中查找。

这是我的目录树:

./WAS80/base/disk1/ad/repository.config
./WAS80/base/disk1/md/repository.config
./WAS80/base/disk2/ad/repository.config
./WAS80/base/disk3/ad/repository.config
./WAS80/base/disk4/ad/repository.config
./WAS80/base/repository.config
./WAS80/fixpack/fp5/repository.config
./WAS80/fixpack_suplements/fp5/repository.config
./WAS80/supplements/disk1/ad/repository.config
./WAS80/supplements/disk1/md/repository.config
./WAS80/supplements/disk2/ad/repository.config
./WAS80/supplements/disk3/ad/repository.config
./WAS80/supplements/disk4/ad/repository.config
./WAS80/supplements/repository.config

我需要加粗的那些,不要在子目录中查找了。

我开始修改这段代码,但我想不通。

pattern='repository.config'
path='/opt/was_binaries'

    def find_all(name, path):
            result = []
            for root, dirs, files in os.walk(path):
                    if name in files:
                            result.append(os.path.join(root, name))
                            continue

            return result

这应该可以满足您的要求:

import os

res = []

for here, dirs, files in os.walk(startdir, topdown=True):
    if 'repository.config' in files:
        res.append(os.path.join(here, 'repository.config'))
        dirs[:] = []

print(res)

每当遇到 'repository.config' 文件时,将 dirs 设置为 [] 以防止 os.walk 进一步下降到该目录树中。

注意:重要的是就地更改 dirs(即 dirs[:] = [])而不是重新绑定它(dirs = [])。,

首先,您必须确保 topdown 设置为 True(这是默认设置),以便在 扫描子目录之前 扫描父目录。

创建一个 existing set() 以记住您在成功找到配置文件时遍历了哪些目录。

然后,当您在列表中找到您的文件名时:

  • 检查文件目录是否不是您注册目录的子目录
  • 如果不是,只需记下existing中的文件路径(添加os.sep,这样就不会在同一级别匹配以当前目录名开头的目录的子字符串:例如:即使 path\to\dir 已经在 set 中,也应该扫描 path\to\dir2。但是 path\to\dir\subdir 将被成功过滤掉)。

代码:

import os

existing = set()
for root,dirs,files in os.walk(path,topdown=True):
    if any(root.startswith(r) for r in existing):
        # current directory is longest and contains a previously added directory: skip
        continue
    if "repository.config" in files:
        # ok, we note down root dir (+ os.sep to avoid filtering siblings) and print the result
        existing.add(root+os.sep)
        print(os.path.join(root,"repository.config"))