Haekt‘s log

[Python3] Linux 디렉토리 안의 파일 리스트 뽑아오기. 본문

언어/Python

[Python3] Linux 디렉토리 안의 파일 리스트 뽑아오기.

Haekt 2023. 3. 5. 22:56

Python 프로젝트를 진행하던 중, 디렉토리 안의 특정 파일을 따로 뽑아와야 하는 상황이 발생했다. 
그래서 OS 모듈을 사용하여 특정 디렉토리의 파일 리스트를 뽑아오도록 했다.
 
코드는 생각보다 매우 간단하다.
 

-  특정 디렉토리의 파일 리스트 뽑아오기 (폴더 포함)

# OS 모듈을 import
import os 

# os.listdir( ) 함수에 특정 디렉토리 경로 입력하여, 디렉토리 안의 파일들을 리스트로 저장. 
file_list = os.listdir('경로')   # ex) os.listdir('/home/hello/test1')

# 파일 리스트 출력
print(file_list)

 
위의 코드만 작성해도, 간단하게 디렉토리 안의 파일들을 리스트로 뽑아올 수 있다.
 
단, 파일이 들어있는 폴더의 경우에는 안의 파일이름 까지는 뽑아오지 않는다. 폴더 이름만 뽑아오게 된다.
예를 들어 /test1/test1-1  디렉토리 안에 test1.txt, test2.txt 가 있을 때, test1의 리스트를 뽑으면 test1-1 만 뽑아진다는 말이다.
 
 

- 예시 ( 특정 폴더 안의 .exe 파일만 골라 모으기 ) 

내 경우에는 portableapps프로그램을 통해 여러 프로그램 exe파일을 수집하려고 했는데, 
다운로드 받아보니 portableapps 폴더 안에 프로그램 이름으로 된 폴더가 있고, 그 안에 .exe 파일 및 설명 txt 파일이 섞여 있었다. 

# 예시

/portableapps/program1
/portableapps/program1/hello1.exe
/portableapps/program1/hello1.txt

/portableapps/program2
/portableapps/program2/hello2.exe
/portableapps/program2/hello2.txt

/portableapps/program3
/portableapps/program4

	...

 
이 경우에 .exe 파일만을 따로 모으려면, 일일히 프로그램 폴더마다 들어가서 옮겨야 했다.
일일히 하는 것은 시간낭비이므로, 아래와 같은 코드를 작성했다. 
 

import os

# 파일경로
pwd = "/mnt/hgfs/portableapps/PortableApps"

# 실패한 파일 리스트
failelist = []

# 찾을 파일의 조건 ex) .exe
find=".exe"

def movefile(file_list):
    fail=[]
    for program in file_list:
            if find in program:
                try:
                    os.system("cp "+pwd+"/"+folder_name+"/"+program+" /home/sai/mal_sha256/normalfile/"+program)
                except:
                	
                    # 복사 실패시, 실패한 파일의 경로 반환.
                    print(program+" move fail")
                    fail.append(program)
	                  continue
                print("moved exe filename : "+program)
    
    return fail


# 파일경로의 프로그램이 파일이 담긴 폴더들을 가져옴
folder_list = os.listdir(pwd)


# 폴더들을 순서대로 반복 
for folder_name in folder_list:
    try:
 
        print("\nfolder name : "+folder_name)
        # 프로그램들이 담긴 폴더들을 순서대로 반복
        file_list = os.listdir(pwd+"/"+folder_name)

        failelist=movefile(file_list)
                
    except:
        pass


# 실패한 목록 재시도 and 재시도 실패 목록 출력
print("\n\n------------ move fail list ------------")
for fail in movefile(failelist):
    print(fail)

 

Comments