이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.24 16:39
shutil은 파이썬 표준 라이브러리에 포함된 모듈로, 파일 및 디렉터리 작업을 위한 고수준 인터페이스를 제공한다. 파이썬 1.4 버전부터 등장하여 파이썬 소프트웨어 재단에 의해 유지보수되고 있다. 이 모듈은 운영체제의 기본 파일 시스템 명령어를 추상화하여, 복잡한 저수준 시스템 호출 없이도 강력한 파일 조작 기능을 사용할 수 있게 해준다.
주요 용도는 파일과 디렉터리의 복사, 이동, 삭제와 같은 일상적인 작업이며, 아카이브 파일의 생성 및 추출 기능도 포함하고 있다. 이로 인해 시스템 관리나 파일 처리 자동화 스크립트를 작성할 때 널리 활용된다. os 모듈이 제공하는 저수준의 파일 작업 기능을 보완하는 역할을 하여, 개발자가 더 편리하고 안전하게 파일을 다룰 수 있도록 지원한다.
shutil 모듈은 파일과 디렉터리를 복사하는 여러 가지 함수를 제공한다. 가장 기본적인 함수는 shutil.copy(src, dst)이다. 이 함수는 소스 파일(src)을 대상 경로(dst)로 복사한다. 대상이 디렉터리 경로라면, 동일한 파일명으로 해당 디렉터리 내에 복사본이 생성된다. 파일의 권한 모드는 복사되지만, 다른 메타데이터는 보존되지 않는다.
파일의 모든 메타데이터를 포함하여 완전히 복사하려면 shutil.copy2(src, dst) 함수를 사용한다. 이 함수는 shutil.copy()의 기능에 더해 최종 수정 시간, 접근 시간 등의 파일 상태 정보를 유지한다. 이는 유닉스 계열 시스템의 cp -p 명령과 유사한 동작이다.
디렉터리 전체를 재귀적으로 복사할 때는 shutil.copytree(src, dst) 함수를 사용한다. 이 함수는 소스 디렉터리(src) 아래의 모든 파일과 하위 디렉터리를 대상 경로(dst)로 복사한다. 대상 디렉터리는 존재하지 않아야 하며, 함수 실행 중에 새로 생성된다. symlinks, ignore 등의 매개변수를 사용하여 심볼릭 링크 처리 방식을 지정하거나 복사에서 제외할 파일을 필터링할 수 있다.
shutil 모듈은 파일과 디렉터리를 이동하거나 이름을 변경하는 기능을 제공한다. 이 작업은 단일 볼륨 내에서는 원자적 연산으로 수행되어 신뢰성이 높다. 주요 함수로는 shutil.move(src, dst)가 있으며, 이 함수는 소스(src) 경로에 지정된 파일이나 디렉터리를 대상(dst) 경로로 이동시킨다. 대상 경로가 디렉터리라면, 소스는 해당 디렉터리 내부로 이동하며 파일명은 유지된다. 대상 경로가 존재하지 않는 경로라면, 이동과 동시에 이름 변경 효과가 발생한다.
이 함수는 내부적으로 os.rename 함수를 먼저 시도한다. os.rename은 동일한 파일 시스템 내에서 빠르게 작동하지만, 서로 다른 파일 시스템 간 이동이 필요한 경우에는 실패한다. 이럴 때 shutil.move는 대체 전략을 사용한다. 먼저 shutil.copy2 함수를 호출하여 소스 파일의 데이터와 메타데이터를 대상 위치로 복사한 후, 복사가 성공적으로 완료되면 os.unlink를 사용하여 원본 소스 파일을 삭제하는 방식으로 이동을 완료한다.
따라서 shutil.move는 단순한 이름 변경부터 다른 디스크나 파티션으로의 이동까지 포괄적으로 처리할 수 있다. 이 과정에서 소스가 디렉터리인 경우, shutil.copytree와 shutil.rmtree의 조합으로 재귀적으로 처리된다. 사용 시 주의할 점은 대상 경로가 이미 존재할 경우, 유닉스 계열 시스템에서는 조용히 덮어쓰지만, 윈도우에서는 오류가 발생할 수 있다는 점이다.
shutil 모듈은 파일과 디렉터리를 삭제하는 기능을 제공한다. 단일 파일을 삭제할 때는 os.remove() 함수를 사용할 수 있지만, shutil은 비어 있지 않은 디렉터리 전체를 삭제하는 등 더 강력한 작업을 지원한다.
주요 삭제 함수로는 shutil.rmtree()가 있다. 이 함수는 지정된 디렉터리와 그 하위에 있는 모든 파일 및 디렉터리를 재귀적으로 삭제한다. 이는 시스템 관리나 정리 작업을 위한 자동화 스크립트 작성 시 유용하다. 또한 shutil.unlink() 함수는 지정된 경로의 파일을 삭제하며, 심볼릭 링크의 경우 링크 자체만 제거한다.
이러한 삭제 작업은 되돌릴 수 없으므로 주의가 필요하다. 특히 shutil.rmtree()는 파일 시스템의 광범위한 영역을 제거할 수 있어, 실수로 중요한 데이터를 삭제하지 않도록 경로를 정확히 확인해야 한다. 작업 전에 삭제할 대상이 맞는지 검증하는 로직을 추가하는 것이 안전한 방법이다.
shutil 모듈은 파일 시스템에서 아카이브 파일을 생성하고 추출하는 기능을 제공한다. 이 기능은 shutil.make_archive()와 shutil.unpack_archive() 함수를 중심으로 동작하며, ZIP과 TAR 형식을 주로 지원한다. 이를 통해 여러 파일과 디렉터리를 하나의 압축 파일로 묶거나, 반대로 압축 파일의 내용을 특정 위치에 풀어낼 수 있다. 이는 데이터 백업, 소프트웨어 배포, 또는 대량의 파일을 효율적으로 전송할 때 유용하게 활용된다.
아카이브 생성 시에는 원본 디렉터리 경로, 아카이브 형식, 그리고 생성될 파일의 이름을 지정한다. 모듈은 내부적으로 해당 형식을 처리할 수 있는 명령줄 도구(예: tar, zip)를 찾아 실행한다. 반대로, 아카이브 추출 시에는 아카이브 파일 경로와 내용을 풀 대상 디렉터리를 지정하면 된다. 이 과정에서 파일 권한과 타임스탬프 같은 일부 메타데이터도 보존될 수 있다.
함수 | 설명 | 주요 매개변수 예시 |
|---|---|---|
| 지정된 형식으로 아카이브 파일을 생성한다. |
|
| 아카이브 파일의 내용을 지정된 디렉터리에 추출한다. |
|
이러한 아카이브 기능은 시스템 관리나 자동화 스크립트 작성 시, 복잡한 명령어를 직접 호출하지 않고도 파이썬 코드 내에서 간결하게 파일 패키징 작업을 수행할 수 있게 해준다. shutil은 os 모듈이나 zipfile 모듈, tarfile 모듈 같은 저수준 모듈의 기능을 조합하여 더 사용하기 편리한 고수준 인터페이스를 제공하는 대표적인 예이다.
shutil 모듈은 파일 시스템의 디스크 사용량을 확인하는 기능도 제공한다. 이 기능은 shutil.disk_usage(path) 함수를 통해 사용할 수 있으며, 지정된 경로가 위치한 파티션의 전체 용량, 사용 중인 용량, 남은 용량을 바이트 단위로 반환한다. 이 함수는 유닉스 계열 시스템의 df 명령어나 윈도우의 디스크 관리 도구와 유사한 정보를 파이썬 스크립트 내에서 프로그래밍적으로 얻을 때 유용하다.
disk_usage 함수는 total, used, free 세 가지 속성을 가진 네임드튜플 객체를 반환한다. 이를 통해 스토리지 공간이 부족한 상황을 사전에 감지하거나, 로그 파일 관리, 백업 스크립트 실행 전 점검 등 다양한 시스템 관리 및 자동화 작업에 활용할 수 있다. 함수의 인자로는 절대 경로나 상대 경로를 문자열 형태로 전달하면 된다.
```python
import shutil
usage = shutil.disk_usage('/')
print(f"전체: {usage.total} 바이트")
print(f"사용: {usage.used} 바이트")
print(f"남음: {usage.free} 바이트")
```
이 함수는 운영 체제의 시스템 호출을 사용하여 정보를 조회하므로, 네트워크 드라이브나 특정 가상 파일 시스템과 같은 원격 또는 가상 스토리지에 대해서도 정확한 사용량 정보를 제공할 수 있다. 다만, 파일 시스템이나 OS에 따라 반환값의 정밀도에 약간의 차이가 있을 수 있다는 점은 주의해야 한다.
shutil 모듈의 기본적인 함수들은 대부분 직관적인 이름을 가지며, 일반적인 파일 시스템 작업을 간단한 호출로 수행할 수 있게 한다. 예를 들어, shutil.copy(src, dst) 함수는 src 파일을 dst 파일이나 디렉터리로 복사한다. dst가 디렉터리를 지정하면, 원본 파일명을 유지하여 해당 디렉터리 내에 복사본을 생성한다. 디렉터리 전체를 복사할 때는 shutil.copytree(src, dst)를 사용하며, 이는 원본 디렉터리의 모든 하위 항목을 포함한 사본을 생성한다.
파일이나 디렉터리를 이동하거나 이름을 변경할 때는 shutil.move(src, dst) 함수를 사용한다. 이 함수는 운영 체제의 기본 이동 연산을 수행하며, 동일한 파일 시스템 내에서는 이름 변경 작업으로 처리된다. 삭제 작업의 경우, shutil.rmtree(path)는 지정된 디렉터리와 그 안의 모든 내용을 재귀적으로 삭제한다. 단일 파일을 삭제할 때는 os 모듈의 os.remove()를 더 자주 사용한다.
아카이브 관련 기능으로는 shutil.make_archive(base_name, format, root_dir) 함수가 있다. 이 함수는 zip, tar, gztar, bztar 등의 형식으로 압축 파일을 생성할 수 있다. 반대로, shutil.unpack_archive(filename, extract_dir) 함수를 사용하면 다양한 형식의 아카이브 파일을 특정 디렉터리에 추출할 수 있다. 이러한 함수들은 명령 줄 인터페이스 도구를 직접 호출하지 않고도 파일 압축 및 해제 작업을 수행할 수 있는 편리한 인터페이스를 제공한다.
shutil 모듈의 함수들은 작업 중 발생할 수 있는 다양한 예외를 발생시킨다. 대표적으로 FileNotFoundError는 지정한 파일이나 디렉터리가 존재하지 않을 때 발생하며, PermissionError는 작업에 필요한 권한이 부족할 때 발생한다. 또한, 동일한 이름의 파일이 이미 존재하는 경우 FileExistsError가 발생할 수 있다.
이러한 예외를 적절히 처리하지 않으면 스크립트가 비정상적으로 종료될 수 있다. 따라서 shutil 함수를 호출할 때는 일반적으로 try-except 블록을 사용하여 예외 처리를 수행한다. 이를 통해 오류 발생 시 사용자에게 메시지를 출력하거나, 대체 작업을 수행하거나, 프로그램을 정상적으로 종료하는 등의 조치를 취할 수 있다.
예를 들어, 파일을 복사하는 shutil.copy2() 함수를 사용할 때는 다음과 같은 방식으로 에러 처리를 구현할 수 있다.
```python
import shutil
import os
source = "/path/to/source.txt"
destination = "/path/to/destination.txt"
try:
shutil.copy2(source, destination)
print(f"파일 복사 성공: {source} -> {destination}")
except FileNotFoundError:
print(f"오류: 원본 파일을 찾을 수 없습니다. ({source})")
except PermissionError:
print(f"오류: 파일에 접근할 권한이 없습니다.")
except Exception as e:
print(f"예상치 못한 오류가 발생했습니다: {e}")
```
특히 디렉터리 전체를 복사하는 shutil.copytree() 함수는 내부적으로 여러 단계의 파일 시스템 작업을 수행하므로, 중간에 오류가 발생하면 이미 복사된 내용을 정리하는 등의 추가 처리가 필요할 수 있다.
shutil 모듈의 copy2() 함수는 파일의 내용뿐만 아니라 파일 메타데이터까지 복사하는 기능을 제공한다. 여기서 복사되는 메타데이터에는 파일의 최종 수정 시간(타임스탬프)과 파일 접근 권한(파일 모드)이 포함된다. 이는 단순히 파일의 데이터만을 복사하는 copy() 함수와의 주요 차이점이다.
보다 정밀한 제어가 필요할 때는 copystat() 함수를 사용할 수 있다. 이 함수는 이미 존재하는 대상 파일에 대해 소스 파일의 메타데이터만을 선택적으로 복사한다. 이를 통해 파일 내용은 그대로 유지하면서 수정 시간이나 권한 같은 속성만을 원본과 동기화할 수 있다. 이러한 메타데이터 복사 기능은 백업 스크립트나 파일 동기화 도구를 작성할 때 유용하게 활용된다.
그러나 모든 운영체제와 파일 시스템에서 모든 메타데이터의 복사가 완벽하게 지원되는 것은 아니다. 예를 들어, 윈도우에서는 파일의 생성 시간(ctime) 복사가 제한될 수 있으며, 리눅스의 확장 속성 같은 고급 메타데이터는 기본 함수로는 복사되지 않는다. 따라서 플랫폼 간 호환성이 중요한 경우에는 복사된 메타데이터를 확인하는 추가적인 로직이 필요할 수 있다.
shutil 모듈은 심볼릭 링크를 처리할 때 기본적으로 링크 자체가 아닌 링크가 가리키는 대상(원본 파일 또는 디렉터리)을 조작한다. 이는 예상치 못한 결과나 데이터 손실을 초래할 수 있으므로, 링크를 직접 다루고자 할 때는 특별한 주의가 필요하다.
많은 shutil 함수는 symlinks라는 매개변수를 제공하여 심볼릭 링크 처리 방식을 제어한다. 예를 들어, shutil.copytree() 함수에서 symlinks=False(기본값)로 설정하면, 복사 과정에서 심볼릭 링크는 무시되고 링크가 가리키는 원본 파일의 내용이 복사되어 새로운 일반 파일이 생성된다. 반면 symlinks=True로 설정하면, 심볼릭 링크 자체가 새로운 위치에 링크로 복사된다. 이때 새로운 링크는 원본 링크와 동일한 대상을 가리키도록 생성되며, 링크의 메타데이터도 가능한 한 보존된다.
심볼릭 링크를 안전하게 다루기 위해서는 os.path.islink() 함수를 사용해 경로가 실제로 링크인지 먼저 확인하는 것이 좋다. 또한, shutil.copy()나 shutil.copy2()와 같은 저수준 복사 함수는 심볼릭 링크를 따라가 원본 파일을 복사하므로, 링크 자체를 복사하려면 os.symlink() 함수를 직접 사용해야 한다. 파일 시스템과 운영 체제에 따라 심볼릭 링크의 동작과 지원 범위에 차이가 있을 수 있으므로, 이식성이 중요한 스크립트를 작성할 때는 테스트가 필수적이다.
shutil 모듈을 사용할 때는 몇 가지 주의점이 있다. 우선, 대부분의 함수는 파일 시스템 객체를 영구적으로 변경하거나 삭제하기 때문에, 특히 shutil.rmtree()와 같은 재귀적 삭제 함수를 사용할 때는 대상 경로를 정확히 확인해야 한다. 실수로 잘못된 디렉터리를 지정하면 복구하기 어려운 데이터 손실로 이어질 수 있다.
또한, shutil.copy()와 shutil.copy2()는 파일 내용 복사에는 문제가 없지만, 소스 파일의 특정 메타데이터(예: 접근 제어 목록, 확장 속성)는 보존하지 않을 수 있다. 심볼릭 링크를 처리할 때는 shutil.copy()가 링크가 가리키는 파일 자체를 복사하는 반면, shutil.copytree()에 적절한 인자를 주지 않으면 심볼릭 링크 구조가 깨질 수 있으므로 문서를 참고하여 의도에 맞는 동작을 선택해야 한다.
윈도우와 유닉스 계열 운영 체제 간의 파일 시스템 및 경로 규칙 차이도 고려해야 한다. 예를 들어, 윈도우에서는 열려 있는 파일을 이동하거나 삭제하는 것이 제한될 수 있으며, 경로명 길이 제한으로 인해 오류가 발생할 수 있다. 모든 작업 전후에 적절한 예외 처리를 통해 PermissionError나 OSError를 핸들링하는 것이 안전한 스크립트 작성에 필수적이다.
shutil 모듈은 파일 시스템 작업을 수행하는 데 특화되어 있지만, 파이썬 표준 라이브러리에는 이를 보완하거나 다른 수준에서 파일 및 운영체제와 상호작용하는 여러 관련 모듈이 존재한다.
가장 기본적인 파일 입출력 작업에는 파이썬 내장 함수인 open()과 io 모듈이 사용된다. 이들은 파일의 내용을 읽고 쓰는 저수준 인터페이스를 제공한다. 파일 경로를 조작하거나 검사할 때는 os.path 모듈이 필수적이며, 경로 문자열을 분리하거나 결합하고 파일의 존재 여부나 유형을 확인하는 기능을 담당한다. 보다 현대적인 경로 객체 지향 인터페이스를 위해서는 파이썬 3.4 이상에서 도입된 pathlib 모듈을 사용할 수 있다.
보다 직접적으로 운영체제 기능을 호출해야 하는 경우에는 os 모듈을 사용한다. 이 모듈은 shutil이 제공하는 고수준 작업의 기반이 되는 시스템 호출(예: 파일 삭제, 이름 변경)을 수행할 수 있으며, 프로세스 관리나 환경 변수 접근 같은 시스템 전반의 기능도 포함한다. 특히 임시 파일이나 디렉터리를 안전하게 생성해야 할 때는 tempfile 모듈이 유용하다. 한편, glob 모듈은 특정 패턴(와일드카드)에 맞는 파일 경로명을 찾는 데 사용되어, shutil로 복사하거나 이동할 파일 목록을 생성하는 데 자주 결합된다.
shutil 모듈은 파이썬의 표준 라이브러리에서 가장 오래되고 신뢰받는 모듈 중 하나이다. 파이썬 1.4 버전부터 포함되어, 수많은 시스템 관리 작업과 자동화 스크립트의 필수 요소로 자리 잡았다. 이 모듈의 이름은 "셸 유틸리티"를 의미하는 영어 "shell utilities"의 약어에서 유래했으며, 이는 명령줄 셸에서 수행하는 일반적인 파일 작업을 파이썬 코드 내에서 수행할 수 있게 해주는 모듈의 본질을 잘 반영한다.
shutil은 운영체제의 기본 파일 조작 기능을 추상화하여 제공함으로써, 사용자가 윈도우, 리눅스, macOS 등 다양한 운영 체제에서 동일한 코드로 파일 시스템 작업을 수행할 수 있게 한다. 이는 크로스 플랫폼 호환성을 중시하는 파이썬 철학의 대표적인 예시이다. 또한, os 모듈이 저수준의 시스템 호출을 제공하는 반면, shutil은 파일이나 디렉터리 전체를 다루는 고수준의 편리한 작업에 특화되어 있어, 두 모듈은 상호 보완적으로 사용된다.
많은 초보자와 전문가 모두가 데이터 백업, 로그 파일 정리, 빌드 산출물 관리, 임시 파일 처리 등 일상적인 작업에서 이 모듈에 의존한다. 특히 shutil.copy2() 함수는 파일의 메타데이터까지 보존하여 복사한다는 점에서 단순 복사 이상의 기능을 제공하며, shutil.make_archive() 함수는 별도의 외부 라이브러리 없이도 ZIP이나 TAR 같은 아카이브를 쉽게 생성할 수 있게 해준다. 이러한 실용성 덕분에 shutil은 파이썬 생태계에서 변함없는 유용성을 인정받고 있다.