2017-04-25 6 views
2

디렉토리에서 repository.config 파일의 첫 번째 모양을 얻고 하위 디렉토리를 보지 않아야합니다.os.walk는 처음 찾은 후 하위 디렉토리를 보지 않습니다.

 
./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 
+0

제대로 코드 한 가지 들여 쓰기하십시오. 파이썬은 매우 공간에 민감합니다. 또 다른 한개를 위해, "이렇게 기본적으로"당신의 절을 시작하지 말라. –

+0

"이 코드로 땜질을하기 시작했는데 알아 내지 못했습니다." 평균? 당신이 싫어하거나 이해하지 못하는 것은 무엇입니까? 구체적으로 기재하십시오. 의견에 회신하지 마십시오! 귀하의 질문을 독립 실행 형 문제 성명으로 편집하십시오. –

답변

4

이것은 당신이 원하는 일을해야한다 : 당신이 'repository.config' 파일을 발생할 때마다

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) 

가 해당 디렉토리 트리에 더 하강에서 os.walk을 방지하기 위해 []dirs을 설정합니다.

2

첫째, 당신은 그래서 부모 디렉토리가 전에 자식 디렉토리를 스캔 (이 기본값) topdownTrue로 설정되어 있는지 확인해야합니다.

existingset()을 작성하여 구성 파일을 찾았을 때 통과 한 디렉토리를 기억하십시오.

그런 다음 목록에서 파일 이름을 찾을 때

  • 체크 파일의 디렉토리가 그렇지 않은 경우
  • 등록 디렉토리의 자식이 아닌 경우, 그냥 길을주의 에있는 파일 (예 : os.sep을 추가하십시오. path\to\dir이 이미 set에 있더라도 ex : 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"))