시스템 운영 또는 PC 사용시 디스크 용량이 부족할 경우 일정 사용량 초과 파일과 일정 기간이 지난 오래된 파일을 찾아서 삭제를 해서 디스크 공간 부족을 해소하는데, 이런 파일을 찾는 것이 여간 귀찮은 것이 아닐까 생각이 됩니다. 물론 이런 경우 앞서 소개 해드린 디스크 사용량 확인 어플리케이션으로 확인이 가능하나, 파일 수량이 많은 경우 개별 확인까지 하면서 삭제하기에는 시간도 많이 걸린다는 단점이 있습니다.
이럴 때 파이썬을 활용하여 검색 조건에 맞는 파일을 찾고 리스팅을 한다면 조금더 빠르게 디스크 공간 확보 작업이 가능할 것으로 생각이 되는데요. 이번 포스팅에서는 특정 조건에 맞는 파일을 찾는 방법에 대해 파이썬을 활용하는 방법에 대해 알아보도록 하겠습니다.
Ⅰ. 특정 조건에 맞는 파일 검색 방법 with 파이썬
Ⅱ. 윈도우즈 OS에서의 파일 검색
Ⅲ. 맥 OS / 리눅스에서의 파일 검색
▷ 도입부에서 얘기한 것과 같이 특정 조건에 맞는 파일 검색 방법은 다양합니다. 다만, 검색 결과가 많은 경우 해당 파일을 각각 개별로 확인하기에는 시간이 오래걸리기 때문에 비효율적입니다.
▷ 따라서 이전 포스팅에서 언급하였던 WinDirStat, SpaceSniffer 툴을 이용하여 전반적인 사용량을 확인한 후 파이썬을 제작한 스크립트를 활용하여 검색 조건에 맞는 파일 리스트(파일 이름/경로, 용량, 생성일 등)을 추출하여 일괄 확인하는 것이 효율적 입니다.
▷ 윈도우즈 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')
▷ 맥 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')
▽ 같이 보면 더 좋은 블로그 글 ▽
파이참(pycharm) 단축키 설명 (1) | 2020.11.17 |
---|---|
웹페이지의 외부 URL 리스트 확인 방법 with 파이썬 (3) | 2020.11.13 |
바이러스토탈(Virustotal)을 이용한 파일 바이러스 점검 (0) | 2020.11.11 |
바이러스토탈을 이용한 웹사이트 악성코드 감염 여부 체크 (2) | 2020.11.10 |
구글 세이프브라우징을 이용한 악성코드 유포 사이트 점검 (0) | 2020.11.09 |
댓글 영역