매일 업데이트
2022-10-11 21:41 8 min

파일을 정기적으로 삭제하는 Python 스크립트

파일 시스템을 주기적으로 수동으로 정리하는 것은 효율적이지 않습니다. 자동화가 훨씬 나은 해결책입니다!

파일과 폴더를 하나씩 직접 삭제하는 작업은 지루하고 시간이 많이 소모됩니다. 자동화하는 것이 훨씬 편리하고 효율적입니다.

이러한 반복적인 작업을 더 쉽게 처리하도록 도와주는 강력한 도구가 바로 파이썬입니다. 파이썬은 스크립트 작성을 위한 훌륭한 프로그래밍 언어이며, 이를 통해 복잡한 작업을 간단하게 처리할 수 있습니다. 먼저 파이썬이 왜 이런 작업에 적합한지 알아보겠습니다.

  • 파이썬은 작업 자동화에 가장 많이 사용되는 언어 중 하나입니다.
  • 다른 언어에 비해 코드를 훨씬 적게 작성할 수 있어 간결합니다.
  • 파이썬은 모든 운영 체제와 호환되어 Windows, Linux, macOS 등 다양한 환경에서 동일한 코드를 실행할 수 있습니다.
  • 파이썬에는 운영 체제와 상호 작용하는 데 유용한 'os'라는 모듈이 있습니다. 이 모듈을 사용하면 파일 삭제를 자동화할 수 있습니다.

파이썬을 활용하여 시스템 관리 작업의 반복적인 부분을 자동화할 수 있습니다. 파이썬을 어느 정도 알고 있다면 특정 시스템 작업을 처리하는 스크립트를 작성하는 것이 어렵지 않습니다. 몇 가지 사용 사례를 살펴보겠습니다.

참고: 아래 예제 코드는 파이썬 3.6 이상 버전에서 테스트되었습니다.

특정 일수가 지난 파일/폴더 제거

오래된 로그 파일은 더 이상 필요하지 않으며, 디스크 공간을 확보하기 위해 정기적으로 정리해야 합니다. 이는 로그 파일뿐 아니라 모든 종류의 파일에 적용될 수 있습니다.

'os' 모듈에는 파일의 마지막 액세스 시간(st_atime), 수정 시간(st_mtime) 및 메타데이터 변경 시간(st_ctime)을 제공하는 'stat'이라는 메서드가 있습니다. 이 메서드들은 에포크 시간 이후의 시간을 초 단위로 반환합니다. 에포크 시간에 대한 자세한 정보는 여기에서 확인할 수 있습니다.

폴더의 하위 폴더를 탐색하려면 'os.walk(path)' 메서드를 사용합니다.

다음 단계를 따라 날짜를 기준으로 파일을 삭제하는 파이썬 코드를 작성할 수 있습니다.

  • 필요한 모듈(time, os, shutil)을 가져옵니다.
  • 삭제할 파일의 경로와 기준 일수를 변수에 설정합니다.
  • 'time.time()' 메서드를 사용하여 설정한 일수를 초 단위로 변환합니다.
  • 'os.path.exists(path)' 모듈을 사용하여 지정된 경로가 존재하는지 확인합니다.
  • 경로가 존재하면 하위 폴더를 포함하여 경로에 있는 모든 파일 및 폴더 목록을 가져옵니다. 'os.walk(path)' 메서드는 폴더, 파일 및 하위 폴더를 포함하는 생성기를 반환합니다.
  • 'os.path.join()' 메서드를 사용하여 현재 경로와 파일/폴더 이름을 결합하여 파일 또는 폴더의 전체 경로를 만듭니다.
  • 'os.stat(path)' 메서드를 사용하여 파일 또는 폴더의 'st_ctime' 속성을 가져옵니다.
  • 가져온 'ctime'을 이전에 계산한 시간과 비교합니다.
  • 비교 결과가 사용자가 지정한 날짜보다 크면 해당 파일 또는 폴더가 삭제 대상인지 확인합니다. 파일이면 'os.remove(path)'를 사용하고, 폴더이면 'shutil.rmtree()' 메서드를 사용합니다.
  • 경로가 존재하지 않으면 해당 경로를 찾을 수 없다는 메시지를 출력합니다.

이제 코드를 자세히 살펴보겠습니다.

import os
import shutil
import time

def main():
    deleted_folders_count = 0
    deleted_files_count = 0

    path = "/삭제할_경로"
    days = 30
    
    seconds = time.time() - (days * 24 * 60 * 60)
    
    if os.path.exists(path):
        for root_folder, folders, files in os.walk(path):
            if seconds >= get_file_or_folder_age(root_folder):
                remove_folder(root_folder)
                deleted_folders_count += 1
                break
            else:
                for folder in folders:
                    folder_path = os.path.join(root_folder, folder)
                    if seconds >= get_file_or_folder_age(folder_path):
                        remove_folder(folder_path)
                        deleted_folders_count += 1
                for file in files:
                    file_path = os.path.join(root_folder, file)
                    if seconds >= get_file_or_folder_age(file_path):
                        remove_file(file_path)
                        deleted_files_count += 1
        else:
            if seconds >= get_file_or_folder_age(path):
                remove_file(path)
                deleted_files_count += 1
    else:
        print(f'"{path}"를 찾을 수 없습니다.')
        deleted_files_count += 1
    
    print(f"총 삭제된 폴더 수: {deleted_folders_count}")
    print(f"총 삭제된 파일 수: {deleted_files_count}")

def remove_folder(path):
    if not shutil.rmtree(path):
        print(f"{path}가 성공적으로 삭제되었습니다.")
    else:
        print(f"{path}를 삭제할 수 없습니다.")

def remove_file(path):
    if not os.remove(path):
        print(f"{path}가 성공적으로 삭제되었습니다.")
    else:
        print(f"{path}를 삭제할 수 없습니다.")

def get_file_or_folder_age(path):
    ctime = os.stat(path).st_ctime
    return ctime

if __name__ == '__main__':
    main()
  

위 코드에서 다음 두 변수를 사용자 환경에 맞게 수정해야 합니다.

days = 30
path = "/삭제할_경로"

특정 크기보다 큰 파일 제거

이제 특정 크기보다 큰 파일을 찾아 삭제하는 방법을 알아보겠습니다. 이전 스크립트와 매우 유사하며, 이전에는 날짜를 매개변수로 사용했지만 이제는 파일 크기를 삭제 기준으로 사용합니다.

import os

def get_file_size(path):
    size = os.path.getsize(path)
    return size

def remove_file(path):
    if not os.remove(path):
        print(f"{path}가 성공적으로 삭제되었습니다.")
    else:
        print(f"{path}를 삭제할 수 없습니다.")

def main():
    path = "경로_입력"
    size = 500

    if os.path.exists(path):
        size = size * 1024 * 1024
        for root_folder, folders, files in os.walk(path):
            for file in files:
                file_path = os.path.join(root_folder, file)
                if get_file_size(file_path) >= size:
                    remove_file(file_path)
        else:
            if os.path.isfile(path):
                if get_file_size(path) >= size:
                    remove_file(path)
    else:
        print(f"{path}가 존재하지 않습니다.")

if __name__ == '__main__':
    main()
  

다음 두 변수를 수정해야 합니다.

path = "경로_입력"
size = 500

특정 확장자를 가진 파일 제거

특정 확장자를 가진 파일만 삭제해야 하는 경우가 있습니다. 예를 들어 '.log' 파일을 삭제해야 한다고 가정해 보겠습니다. 'os.path.splitext(path)' 메서드를 사용하면 파일의 확장자를 쉽게 찾을 수 있습니다. 이 메서드는 파일 경로와 확장자를 튜플 형태로 반환합니다.

import os

def main():
    path = "경로_입력"
    extension = ".log"
    
    if os.path.exists(path):
        if os.path.isdir(path):
            for root_folder, folders, files in os.walk(path):
                for file in files:
                    file_path = os.path.join(root_folder, file)
                    file_extension = os.path.splitext(file_path)[1]
                    if extension == file_extension:
                        if not os.remove(file_path):
                            print(f"{file_path}가 성공적으로 삭제되었습니다.")
                        else:
                            print(f"{file_path}를 삭제할 수 없습니다.")
        else:
            print(f"{path}는 디렉토리가 아닙니다.")
    else:
        print(f"{path}가 존재하지 않습니다.")

if __name__ == '__main__':
    main()

위 코드에서 경로와 확장자 변수를 요구 사항에 맞게 변경해야 합니다.

실제 운영 환경에 적용하기 전에 먼저 개발 환경에서 스크립트를 테스트하는 것이 좋습니다. 결과에 만족하면 cron (Linux를 사용하는 경우) 등을 사용하여 스크립트를 정기적으로 실행하도록 예약할 수 있습니다. 파이썬은 이 모든 작업을 매우 편리하게 수행할 수 있게 해줍니다. 더 많은 자동화 방법을 배우고 싶다면 Udemy 강좌를 참고해보세요.

이 글이 유익했나요? 다른 사람들과 공유해 보세요!

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.