언어/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)