오늘은 파이썬을 이용하여 디렉토리 하위 검색하는 방법을 알아보려고 합니다.

 

먼저 디렉토리 하위의 목록을 가져오는 작업입니다.

검색 디렉토리 대상은 /app 라고 해볼께요.

import os
 
def search(dir):
        files = os.listdir(dir)
        for file in files:
                print(file)
 
search("/app")

 

위 프로그램은 디렉토리 하위의 파일명을 보여줍니다.

하지만 절대 경로는 아니고 상대 경로죠. 상위 디렉토리(parent)까지 포함하여 보여주도록 수정할께요.

import os
 
def search(dir):
        files = os.listdir(dir)
        for file in files:
                fullFilename = os.path.join(dir, file)
                print(fullFilename)
 
search("/app")

 

그런데 디렉토리 하위에 또 디렉토리가 있다면?

디렉토리 이름만 보여주고 끝낼 것이 아니라 다시 그 디렉토리 내부도 뒤졌으면 합니다.

import os
 
def search(dir):
        files = os.listdir(dir)
        for file in files:
                fullFilename = os.path.join(dir, file)
                if os.path.isdir(fullFilename):
                        search(fullFilename)
                else:
                        print(fullFilename)
 
search("/app")

 

지금은 검색하려는 디렉토리가 하드코드 되어 있습니다만..

이걸 커맨드 아규먼트로 입력받도록 수정하겠습니다.

(추가로 sys를 import 해야 합니다)

import os
import sys
 
def search(dir):
        files = os.listdir(dir)
        for file in files:
                fullFilename = os.path.join(dir, file)
                if os.path.isdir(fullFilename):
                        search(fullFilename)
                else:
                        print(fullFilename)
 
searchDir = sys.argv[1]
search(searchDir)

 

그런데 만약에 권한이 없는 디렉토리를 뒤지려고 한다면?

Traceback (most recent call last):
  File "searchDir.py", line 14, in 
    search(searchDir)
  File "searchDir.py", line 5, in search
    files = os.listdir(dir)
PermissionError: [Errno 13] Permission denied: '/root'

위와 같은 에러가 날거구요.

다음과 같이 예외처리를 해보죠.

import os
import sys
 
def search(dir):
        try:
                files = os.listdir(dir)
                for file in files:
                        fullFilename = os.path.join(dir, file)
                        if os.path.isdir(fullFilename):
                                search(fullFilename)
                        else:
                                print(fullFilename)
        except PermissionError:
                pass
 
searchDir = sys.argv[1]
search(searchDir)