OS/CentOS&Rocky

[Linux] 하위 디렉토리의 파일 개수 및 용량 조사

Gadget 2025. 10. 1. 11:36

 

하위 디렉토리의 파일 개수 및 용량 조사하는 프로그램입니다.

py 파일 생성 후 디렉토리 지정하여 실행하면 directory_stats.csv 로 만들어 집니다.

 

# vi dir_stats.py

import os
import csv
import sys
from datetime import datetime

def get_dir_file_stats(base_path):
    dir_stats = []
    for root, dirs, files in reversed(list(os.walk(base_path))):
        file_count = len(files)
        total_size = 0
        for f in files:
            try:
                fp = os.path.join(root, f)
                total_size += os.path.getsize(fp)
            except OSError:
                pass
        for d in dirs:
            sub_dir = os.path.join(root, d)
            sub_stats = next((item for item in dir_stats if item[0] == sub_dir), None)
            if sub_stats:
                file_count += sub_stats[1]
                total_size += sub_stats[2]
        dir_stats.append((root, file_count, total_size))
    dir_stats.sort(key=lambda x: x[0].count(os.sep))
    return dir_stats

def save_to_csv_with_times(stats, output_file, start_time, end_time):
    with open(output_file, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(["시작시간", start_time.strftime("%Y-%m-%d %H:%M:%S")])
        writer.writerow(["종료시간", end_time.strftime("%Y-%m-%d %H:%M:%S")])
        writer.writerow([])
        writer.writerow(["경로", "파일개수", "용량(bytes)"])
        for row in stats:
            writer.writerow(row)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        base_dir = sys.argv[1]
    else:
        base_dir = input("탐색할 기본 디렉토리 경로를 입력하세요 (기본 현재 디렉토리): ").strip()
        if not base_dir:
            base_dir = "."

    start_time = datetime.now()
    stats = get_dir_file_stats(base_dir)
    end_time = datetime.now()

    output_file = "directory_stats.csv"
    save_to_csv_with_times(stats, output_file, start_time, end_time)
    print(f"결과가 '{output_file}' 파일로 저장되었습니다.")

 

# nohup python dir_stats.py 디렉토리 &