상세 컨텐츠

본문 제목

사용량 초과 또는 기간 경과 파일 검색 with 파이썬

Python

by mp.jamong 2020. 11. 12. 07:28

본문

 

시스템 운영 또는 PC 사용시 디스크 용량이 부족할 경우 일정 사용량 초과 파일과 일정 기간이 지난 오래된 파일을 찾아서 삭제를 해서 디스크 공간 부족을 해소하는데, 이런 파일을 찾는 것이 여간 귀찮은 것이 아닐까 생각이 됩니다. 물론 이런 경우 앞서 소개 해드린 디스크 사용량 확인 어플리케이션으로 확인이 가능하나, 파일 수량이 많은 경우 개별 확인까지 하면서 삭제하기에는 시간도 많이 걸린다는 단점이 있습니다.

 

이럴 때 파이썬을 활용하여 검색 조건에 맞는 파일을 찾고 리스팅을 한다면 조금더 빠르게 디스크 공간 확보 작업이 가능할 것으로 생각이 되는데요. 이번 포스팅에서는 특정 조건에 맞는 파일을 찾는 방법에 대해 파이썬을 활용하는 방법에 대해 알아보도록 하겠습니다.

 

 

Contents | 사용량 초과 또는 기간 경과 파일 검색 with 파이썬

Ⅰ. 특정 조건에 맞는 파일 검색 방법 with 파이썬

Ⅱ. 윈도우즈 OS에서의 파일 검색

Ⅲ. 맥 OS / 리눅스에서의 파일 검색

 

 

1. 특정 조건에 맞는 파일 검색 방법 with 파이썬

 

▷ 도입부에서 얘기한 것과 같이 특정 조건에 맞는 파일 검색 방법은 다양합니다. 다만, 검색 결과가 많은 경우 해당 파일을 각각 개별로 확인하기에는 시간이 오래걸리기 때문에 비효율적입니다.

 

▷ 따라서 이전 포스팅에서 언급하였던 WinDirStat, SpaceSniffer 툴을 이용하여 전반적인 사용량을 확인한 후 파이썬을 제작한 스크립트를 활용하여 검색 조건에 맞는 파일 리스트(파일 이름/경로, 용량, 생성일 등)을 추출하여 일괄 확인하는 것이 효율적 입니다.

 

2. 윈도우즈 OS에서의 파일 검색

 

▷ 윈도우즈 OS에서의 파일 경로, 즉 드라이브와 폴더, 파일을 구분하는 구분자는 '\' 입니다. 파이썬으로 구현한 내용 중 경로를 구분하는 구분자가 중요한데 이 부분은 맥 OS 또는 리눅스 시스템과 다르기 때문입니다.

 

▷ 파이썬 코드로 구현한 내용은 아래와 같으며, 사용 방법은 search 함수에서 검색하고자 하는 검색 경로와 파일 크기를 지정하고 실행하면 됩니다. 일정 기간 지난 파일 검색은 주석으로 처리하였으니, 필요하신 분은 주석 해제 후 사용이 가능합니다.

 


# -*- coding: utf-8 -*-

import os, time, datetime

def search(path_target, days_elapsed, filesize_gb_excess):
    try:
        for (path, dir, files) in os.walk(path_target):
            for filename in files:
            
                # 검색 결과 저장
                with open('largeFiles.csv', 'a', encoding='UTF8') as f:
                    fullname = path + '\\' + filename
                    current = datetime.datetime.now()

                    if (len(fullname) > 255 or len(path) > 255):
                        # 파일 이름 길이 체크
                        filesize_kb = 0
                        filesize_gb = 0
                        filetime = 0
                        filetime_diff_days = 0
                        path1 = "NULL"
                        print("길이 초과 파일 이름 : ", filename)
                    else:
                        # 파일 생성 ID
                        fileowner = os.stat(fullname).st_uid

                        # 파일 경로, 이름, 사이즈 계산
                        filesize_kb = os.stat(fullname).st_size
                        filesize_gb = round(filesize_kb / (1024 * 1024 * 1024), 2)
                        path1 = path

                        # 파일 생성일자, 일자 계산 (mtime 기준) (생성일 기준으로 조회시 mtime을 ctime으로 변경 후 스크립트 실행)
                        mtime = os.stat(fullname).st_mtime
                        filetime = datetime.datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M')
                        filetime1 = datetime.datetime.fromtimestamp(mtime)
                        filetime_diff = current - filetime1
                        filetime_diff_days = filetime_diff.days

                    # 특정 사이즈 초과 파일 리스트 추출
                    if int(filesize_gb) > int(filesize_gb_excess):
                        print(path1, '\t', filename, '\t', fileowner, '\t', filesize_gb, 'GB', '\t', filetime, '\t',
                              '+', filetime_diff_days, '일', file=f)

                    # 오래된 파일 리스트 추출 (mtime 기준)
                    # if int(filesize_gb) > int(days_elapsed):
                    #    print(path1,'\t', filename, '\t', fileowner, '\t', filesize_gb, 'GB', '\t', filetime, '\t',
                    #         '+', filetime_diff_days, '일', file=f)

    except (PermissionError, FileNotFoundError) as e:
        print(e)
        pass


search(path_target='C:\\Users', days_elapsed='365', filesize_gb_excess='1')

 

 

3. 맥 OS / 리눅스에서의 파일 검색

 

▷ 맥 OS 또는 리눅스에서의 파일 경로, 즉 드라이브와 폴더, 파일을 구분하는 구분자는 '/' 입니다. 파이썬으로 구현한 내용 중 경로를 구분하는 구분자가 중요한데 이 부분은 윈도우즈 OS와 다르기 때문입니다.

 

파이썬 코드로 구현한 내용은 아래와 같으며, 사용 방법은 search 함수에서 검색하고자 하는 검색 경로와 파일 크기를 지정하고 실행하면 됩니다. 일정 기간 지난 파일 검색은 주석으로 처리하였으니, 필요하신 분은 주석 해제 후 사용이 가능합니다.

 


# -*- coding: utf-8 -*-

import os, time, datetime

def search(path_target, days_elapsed, filesize_gb_excess):
    try:
        for (path, dir, files) in os.walk(path_target):
            for filename in files:
                
                # 검색 결과 저장
                with open('largeFiles.csv', 'a', encoding='UTF8') as f:
                    fullname = path + '/' + filename
                    current = datetime.datetime.now()

                    if (len(fullname) > 255 or len(path) > 255):
                        # 파일 이름 길이 체크
                        filesize_kb = 0
                        filesize_gb = 0
                        filetime = 0
                        filetime_diff_days = 0
                        path1 = "NULL"
                        print("길이 초과 파일 이름 : ", filename)
                    else:
                        # 파일 생성 ID
                        fileowner = os.stat(fullname).st_uid

                        # 파일 경로, 이름, 사이즈 계산
                        filesize_kb = os.stat(fullname).st_size
                        filesize_gb = round(filesize_kb / (1024 * 1024 * 1024), 2)
                        path1 = path
                        
                        # 파일 생성일자, 일자 계산 (mtime 기준) (생성일 기준으로 조회시 mtime을 ctime으로 변경 후 스크립트 실행)
                        mtime = os.stat(fullname).st_mtime
                        filetime = datetime.datetime.fromtimestamp(mtime).strftime('%Y-%m-%d %H:%M')
                        filetime1 = datetime.datetime.fromtimestamp(mtime)
                        filetime_diff = current - filetime1
                        filetime_diff_days = filetime_diff.days

                    # 특정 사이즈 초과 파일 리스트 추출
                    if int(filesize_gb) > int(filesize_gb_excess):
                        print(path1, '\t', filename, '\t', fileowner, '\t', filesize_gb, 'GB', '\t', filetime, '\t',
                              '+', filetime_diff_days, '일', file=f)

                    # 오래된 파일 리스트 추출 (mtime 기준)
                    # if int(filesize_gb) > int(days_elapsed):
                    #    print(path1,'\t', filename, '\t', fileowner, '\t', filesize_gb, 'GB', '\t', filetime, '\t',
                    #         '+', filetime_diff_days, '일', file=f)

    except (PermissionError, FileNotFoundError) as e:
        print(e)
        pass


search(path_target='/Users', days_elapsed='365', filesize_gb_excess='1')

 

 

 

▽ 같이 보면 더 좋은 블로그 글 

 

윈도우즈 폴더별 사용량 확인 프로그램(WinDirStat, SpaceSniffer)

컴퓨터를 사용하다보면 데이터 관리가 잘 안되고, 어느 폴더에서 사용량이 많은지 확인하는 과정이 꽤 귀찮게 여겨질 때가 있습니다. 이런 불편함을 해소할 수 있는 프로그램을 소개 드립니다.

mpjamong.tistory.com

 

[PYTHON] 파이참(PyCharm) 설치

파이썬 프로그래밍을 쉽게 도와주는 IDE(통합개발환경) 어플리케이션인 파이참(PyCharm)을 소개하고자 합니다. 파이참(PyCharm)은 Intellij를 만든 Jetbrain에서 만든 파이썬 통합개발 환경으로 다양한 기

mpjamong.tistory.com

관련글 더보기

댓글 영역