[Python] glob Module 사용법
glob은 Globs (Global Patterns)으로 Linux에서 널리 사용되온 pattern matching 기법이다. 주로 설정 내용을 프로젝트 내의 일부 파일에서만 적용하고 싶을 때 Globs가 사용되는데 대표적으로 .gitignore이 있다.
정규표현식 (Regular Expression)과 Globs는 비슷해 보이지만 문법이 미묘하게 다르다. Globs는 파일 시스템을 검색하는데 특화되어 있는 반면에, 정규표현식은 범용적으로 사용할 수 있는 매칭 기법이다. 따라서 정규표현식은 Globs보다 더 강력한 문자열 매칭을 제공하며 문법도 더 복잡하다.
단순히 파일을 찾을 때는 Globs를 쓰는게 더 쉽고 유리할 수 있다.
기본적인 문법
| Function | Description | 
|---|---|
| * | – 임의의 문자열을 의미한다. – *.*는 임의의문자열.확장자형태를 의미한다. | 
| ? | – 임의의 한 문자를 의미한다. – ?.txt는 임의의 한문자.txt형태를 의미한다. | 
| [] | – 대괄호 안에 있는 문자 중 하나를 의미한다. – [abc].txt는a.txt,b.txt,c.txt형태를 의미한다. | 
| ** | – 임의의 경로를 의미한다. 특히 특정 root에서 다양한 깊은 file tree에서 특정 파일들을 찾을 때 유용하게 사용된다. – ./src/**/*.txt는./src/안에 있는 임의의 경로에 있는 모든 파일 중 *.txt 파일들을 의미한다.– 사용시 반드시 recursive=True인자를 전달해줘야 한다. | 
| {} | – 복수 개의 문자열을 매칭 할 때 사용된다. – **/*.{jpg,JPG}는 임의의 경로 중*.jpg또는*.JPG로 마치는 파일들을 의미한다. | 
| () | – Wildcard ( *) 매칭 시 어느 정도 선택지를 제한해줄 수 있다.– ?(ab|cd)라는 패턴은ab또는cd와 매칭되며 빈문자열과도 매칭된다..– 반면에 *(ab|cd)라는 패턴은ab,abab,cd,cdcd,abcd,cdab,ababcdabcd등 다양한 문자열과 매칭될 수 있다. | 
Example
# 해당 경로의 모든 파일 찾기
print(glob.glob("*.*"))
# 해당 경로의 모든 폴더 찾기
print(glob.glob("*/"))
# 해당 경로의 .txt로 마치는 모든 파일 찾기
print(glob.glob("**/*.txt", recursive=True))
# 숫자로 시작하는 모든 txt 파일 찾기
print(glob.glob("./**/[0-9]*.txt", recursive=True))
# 또는 iglob을 사용할 수 도 있다.
for i in glob.iglob("./**/[0-9]*.txt", recursive=True):
    print(i)
# 특정 폴더에서 알파벳으로 시작하는 모든 확장자의 파일 찾기
print(glob.glob("./**/[a-zA-Z]*.*", recursive=True))
# 특정 폴더에서 한글로 시작하는 모든 확장자의 파일 찾기
print(glob.glob("**/[가-힣ㄱ-ㅎㅏ-ㅡ]*.*", recursive=True))
# 특정 폴더에서 어떠한 두글자 다음 suffix로 끝나는 모든 확장자의 파일 찾기
print(glob.glob("**/??suffix.*", recursive=True))
import os
import glob
import shutil
source = {
    "Images": [".jpg", ".png", ".jpeg", ".bmp"],
    "Documents": [".docx", ".txt", ".xlsx", ".pdf", ".pptx"],
    "Videos": [".avi", ".mp4", ".mkv"]
}
for foldername, extensions in source.items():
    
    files = os.listdir("src/Exercise01")
    dest = os.path.join("src/Exercise01", foldername)
    for file in files:
        extension = os.path.splitext(file)[-1]
        src = os.path.join("src/Exercise01", file)
        os.makedirs(dest, exist_ok=True)
        if extension in extensions:
            shutil.move(src, dest)
위 코드는 파일을 확장자 별로 분류하는 코드다.
- jpg, png, jpeg, bmp 의 확장자는 src/Exercise01/Images폴더로 이동되어야 합니다.
- docx, txt, xlsx, pdf 의 확장자는 src/Exercise01/Documents폴더로 이동되어야 합니다.
- avi, mp4, mkv 의 확장자는 src/Exercise01/Vidoes폴더로 이동되어야 합니다.
