파일 정리

스크립트

  • cleanup_file.py
import os
import re
import yaml

def is_markdown_file(file):
    return file.endswith('.md')

def is_referenced_image(file, md_directory):
    # 이미지 파일이 마크다운 파일에서 참조되고 있는지 확인하는 함수.    
    file_name = os.path.basename(file)
    for root, _, md_files in os.walk(md_directory):
        for md_file in md_files:
            if is_markdown_file(md_file):
                md_file_path = os.path.join(root, md_file)
                with open(md_file_path, 'r', encoding='utf-8') as f:
                    content = f.read()
                    if file_name in content:
                        return True
    return False

def remove_unreferenced_images_and_files(directory, md_directory):
    # 참조되지 않는 이미지 파일과 기타 파일을 삭제하는 함수.    
    for root, _, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if not is_markdown_file(file) and not is_referenced_image(file_path, md_directory):
                os.remove(file_path)
                print(f"Deleted unreferenced file: {file_path}")

def remove_empty_markdown_files(directory):
    # 내용이 없거나 메타데이터만 있는 마크다운 파일을 삭제하는 함수.    
    metadata_pattern = re.compile(r"---(.*?)---", re.DOTALL)

    for root, _, files in os.walk(directory):
        for file in files:
            if is_markdown_file(file) and file != "_index.md":
                file_path = os.path.join(root, file)
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()

                metadata_match = metadata_pattern.match(content)
                if metadata_match:
                    metadata_content = metadata_match.group(1)
                    remaining_content = content[metadata_match.end():].strip()
                    if not remaining_content:
                        os.remove(file_path)
                        print(f"Deleted empty markdown file: {file_path}")

def remove_bak_files(directory):
    # .bak 파일을 삭제하는 함수.
    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith('.bak'):
                file_path = os.path.join(root, file)
                os.remove(file_path)
                print(f"Deleted .bak file: {file_path}")

def remove_orphan_index_files(directory):
    # .md 파일이나 서브 폴더가 없는데 _index.md 파일이 있는 경우 해당 _index.md 파일을 제거하는 함수.
    for root, dirs, files in os.walk(directory):
        # .md 파일이나 서브 폴더가 없는지 확인
        has_md_files_or_subdirs = any(is_markdown_file(f) for f in files if f != "_index.md") or bool(dirs)
        
        if not has_md_files_or_subdirs:
            index_file_path = os.path.join(root, "_index.md")
            if os.path.exists(index_file_path):
                os.remove(index_file_path)
                print(f"Deleted orphan _index.md file: {index_file_path}")

# 디렉토리 경로 설정
directory_path = r'D:\Obsidian\DocFlow\Resources'
md_directory_path = r'D:\Obsidian\DocFlow'

print(f"Cleanup File : unreferenced_images_and_files")
# 참조되지 않는 이미지 파일과 기타 파일 삭제
remove_unreferenced_images_and_files(directory_path, md_directory_path)

print(f"Cleanup File : empty_markdown_files")
# 내용이 없거나 메타데이터만 있는 마크다운 파일 삭제
remove_empty_markdown_files(md_directory_path)

# .bak 파일 삭제
print(f"Cleanup File : .bak files")
remove_bak_files(md_directory_path)

# .md 파일이나 서브 폴더가 없는데 _index.md 파일이 있는 경우 제거
print(f"Cleanup File : orphan_index_files")
remove_orphan_index_files(md_directory_path)
print()

스크립트 설명

  • .md 파일에서 참조되지 않는 이미지나 파일을 삭제합니다.
  • 내용이 없거나 메타데이터만 있는 마크다운 파일을 삭제합니다.
    • _index.md 파일은 제외합니다.