ふぁいる整理の 日々 | 60歳を迎えて、思うこと。

60歳を迎えて、思うこと。

いつの間にか、「60」という年月が経ちました。
残り少ないか多いか?わかりませんが。
じじぃ~の「ひとりごと」を細々と続けられれば。。。

ふぁいる整理の 日々

60年 たまりにたまった

ふぁいる!

日々
お掃除中

あれやこれや で


拡張子 で 振り分け 終わった

七転八倒 で


キーワードで 振り分け 終わった

でも

大量の 未分類 ふぁいる

じゃあ


乱暴だけど!

小さな ファイルを

ファイルサイズで
振り分ける!

【Gemini】様 作成

ファイルサイズで
振り分けちゃうよ!
すくりぷと

# ==============================2026/05/04 12:38:34
# 2026/04/08 20:23:11
# 【Gemini】
# プログラムは「指示されたこと以外は、どうしていいかわからない」という性質があるので、今回のように「条件に合わないものはどうするか」を明示してあげる必要がありますね。
# **パターンA(10kB以上は無視して移動させない)**を組み込んだ全文を作成しました。
# そのままコピー&ペーストして実行してみてください。



import os
import shutil
from pathlib import Path
# ==========================================================
# 🔍 1. 設定項目
# ==========================================================
# 検索を開始するルートフォルダ
SEARCH_DIR = Path(r"E:\__WORK")

# ファイルの移動先フォルダ
DEST_DIR = Path(r"E:\__WORK-MOVE-SIZE")

# 検索対象の拡張子
TARGET_EXT = ".txt"

# 💡 1kB = 1024バイト
# KB = 1024
B = 1

# ファイルサイズと移動先フォルダ名の定義
# ここに含まれないサイズ(10kB以上)は「移動対象外」として扱います
SIZE_RANGES = [
    (10 * B,   "010B"),  # 0KB以上 ~ 1KB未満
    (20 * B,   "020B"),  # 1KB以上 ~ 2KB未満
    (30 * B,   "030B"),  # 2KB以上 ~ 3KB未満
    (40 * B,   "040B"),  # 3KB以上 ~ 4KB未満
    (50 * B,   "050B"),  # 4KB以上 ~ 5KB未満
    (60 * B,   "060B"),  # 4KB以上 ~ 5KB未満
    (70 * B,   "070B"),  # 4KB以上 ~ 5KB未満
    (80 * B,   "080B"),  # 4KB以上 ~ 5KB未満
    (90 * B,   "090B"),  # 4KB以上 ~ 5KB未満
]

# ==========================================================
# ⚙️ 2. 関数定義
# ==========================================================
def get_destination_folder_name(file_size_bytes):
    """
    ファイルサイズに基づいて移動先を決定。
    SIZE_RANGESに該当しない場合は None を返す。
    """
    for max_size, folder_name in SIZE_RANGES:
        if file_size_bytes < max_size:
            return folder_name
    
    # どの範囲にも当てはまらない(10kB以上)場合は None を返す
    return None

def sort_files_by_size(search_dir, dest_dir, target_ext):
    """
    指定フォルダを再帰的に検索し、10kB未満のファイルのみを分類移動します。
    """
    if not search_dir.is_dir():
        print(f"エラー: 検索フォルダが存在しません: {search_dir}")
        return

    dest_dir.mkdir(parents=True, exist_ok=True)
    
    print(f"検索開始フォルダ: {search_dir}")
    print(f"移動先ルートフォルダ: {dest_dir}")
    print(f"対象拡張子: {target_ext}\n")

    search_pattern = f"**/*{target_ext}" 
    
    file_count = 0
    moved_count = 0
    skip_count = 0

    for file_path in search_dir.rglob(search_pattern):
        if file_path.is_file():
            file_count += 1
            
            try:
                # ファイルサイズの取得
                file_size = file_path.stat().st_size
                
                # 移動先のフォルダ名を決定
                folder_name = get_destination_folder_name(file_size)
                
                # 【修正ポイント】 フォルダ名が取得できない(10kB以上)場合はスキップ
                if folder_name is None:
                    skip_count += 1
                    continue
                
                # 移動先パスの作成
                target_folder = dest_dir / folder_name
                target_folder.mkdir(parents=True, exist_ok=True)
                dest_path = target_folder / file_path.name
                
                # ファイル移動
                shutil.move(file_path, dest_path)
                
                print(f"✅ 移動: {file_path.name} ({file_size / B:.2f}KB) -> {target_folder.name}/")
                moved_count += 1

            except Exception as e:
                print(f"❌ エラー発生: {file_path} の処理中にエラー: {e}")

    print("\n=============================================")
    print(f"処理完了")
    print(f"全対象ファイル: {file_count} 個")
    print(f"移動済み: {moved_count} 個")
    print(f"スキップ(10kB以上): {skip_count} 個")
    print("=============================================")


# ==========================================================
# 🚀 3. スクリプト実行
# ==========================================================
if __name__ == "__main__":
    sort_files_by_size(SEARCH_DIR, DEST_DIR, TARGET_EXT)


### 修正のポイント
# 1.  **`get_destination_folder_name`**: 10kB以上の場合に `None`(空っぽの状態)を返すようにしました。
# 2.  **`sort_files_by_size`**: `if folder_name is None: continue` という処理を追加しました。これにより、10kB以上のファイルを見つけても「あ、これは何もしなくていいんだな」と判断して次のファイルへ進むようになります。
# これで、`UNKNOWN_SIZE` フォルダができることもなく、大きなファイルは元の場所に残るはずです!
# ==============================