ふぁいる整理の 日々
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` フォルダができることもなく、大きなファイルは元の場所に残るはずです!
# ==============================