BD-R x 50枚
むか~~~~し
ぶるれこ様
の
番組録画用に
購入した
25GB の BD-R
あんまり
使わなくて
いまだに
残っている・・・
2024 - 02 - 18
南米の密林で
2090円 50枚で

なんか?
おかしくね???
DVD-R
10枚 5000円 くらい
だったのに・・・
BD-R
50枚 約2000円
おっかしいだろ!
じじぃ~
WIMOWEH!!! The Best Of The Tokens
らいおん~~~♪
ねちゃうよ~♪
ねちゃったよ~~♪
映画
最高の人生の見つけ方
さいこうのじんせいのみつけかた
原題: The Bucket List
2007年 アメリカ映画
の 挿入歌
The Lions Sleeps Tonight
The Tokens
で
一目ぼれ ならぬ
一「聴」ぼれ して
映画の エンドロールを
睨め付け
曲名を 確認して・・・
CDを
レンタル
それでは 収まらず・・・
棒フリマサイトで
WIMOWEH!!! The Best Of The Tokens
を
購入・・・
病気だぜ
ええ~~~曲や!
じじぃ~
01 01_ 01- と~~~いつ
ぶひぶひ
わんわん
前から
気になっていたんだけど・・・
音楽CDを
リッピングしたとき
ファイル名の先頭が
01 じじぃ~の青春.wav
だったり
01_じじぃ~の青春.wav
だったり
01-じじぃ~の青春.wav
だったり
と
統一性が ない
そこで
【Gemini】様に泣きついて
統一スクリプトを
作成して貰った
試験ば~~~~じょん Rev.なし
ご指摘ありがとうございます。非常に重要な点ですね。
前回のスクリプトでは、ご要望の「ソート順での連番振り直し」と「既存の番号をベースにした処理」が混在していました。特に**曲番の欠番を保持したい**という点と、**既に番号がある場合はソート順での連番振り直しを**「しない(または、既存番号を尊重する)」という意図を理解しました。
いただいた疑問点と新しい要件に基づき、スクリプトのロジックを以下の通りに再構築します。
## 修正ロジックの再確認と変更点
### 1\. 📂 再帰的処理と対象ファイル
* **変更なし**: `os.walk`で指定フォルダ以下を再帰的に検索し、対象拡張子 (`.wav`, `.wave`, `.mp3`, `.flac`) のファイルのみを処理します。
### 2\. 🔢 曲番付与・書式統一のルール(最重要)
* **ソート処理の廃止**: **フォルダ内のファイルリストのソートを完全に廃止します。** `os.walk`で取得されたファイルリストをそのまま使用し、既存の曲番の有無と形式によって処理を分岐します。
* **理由**: 欠番(例: 01, 03)を保持するため、また、既に曲番があるファイルに対しては、曲番を振り直さずに書式統一のみを行うためです。
* **処理パターン**: ファイル名の**先頭3文字**(`XX` と区切り文字)のみを対象とします。
| ファイル名の現状(先頭3文字) | 処理 | 結果形式 | 例 |
| :--- | :--- | :--- | :--- |
| **`XX-`** (ハイフン型) | **変更しない** | `XX-曲名` | `01-曲名.wav` $\rightarrow$ `01-曲名.wav` |
| **` XX `** (スペース型) | **`XX-` に統一** | `XX-曲名` | `01 曲名.wav` $\rightarrow$ `01-曲名.wav` |
| **`XX_`** (アンダーバー型) | **`XX-` に統一** | `XX-曲名` | `01_曲名.wav` $\rightarrow$ `01-曲名.wav` |
| **曲番なし** (`X...` または `曲...`) | **ソート順で連番付与** | `XX-曲名` | `曲名.wav` $\rightarrow$ **`01-曲名.wav`** |
* **補足**: 既存の曲番(例: `01-`)があるファイルは変更しないため、`01`と`03`が存在し、`02`が欠番の場合、リネーム後も`01`と`03`の曲番は維持されます。ただし、曲番なしのファイルが混在する場合、それらはソートされずにリストの出現順(ファイルシステム上の順)に連番が付与されます。
## 🛠 修正後のPythonスクリプト
以下のスクリプトは、上記ロジックに基づいて**ソート処理を削除**し、**既存の番号を尊重**しつつ、**書式統一**と**番号なしファイルへの連番付与**を両立させます。
```python
import os
import re
# =========================================================
# 設定
# =========================================================
# 対象フォルダのパス
# 例: folder_path = "C:\\_CC-Rename"
folder_path = "C:\\_CC-Rename"
# 対象とする拡張子 (小文字で指定)
TARGET_EXTENSIONS = ('.wav', '.wave', '.mp3', '.flac')
# 正規表現パターン:ファイル名の先頭にある既存の曲番を検出 (XX[ -_])
TRACK_PATTERN_OTHER = re.compile(r"^(\d{2})[\s_]") # XX (スペース) または XX_ (アンダーバー) を検出
TRACK_PATTERN_HYPHEN = re.compile(r"^\d{2}-") # XX- (ハイフン) を検出 (変更しない対象)
# =========================================================
# メイン処理
# =========================================================
def rename_files_recursively(root_dir):
"""
指定されたフォルダ以下を再帰的に検索し、ファイル名をリネームします。
"""
for root, dirs, files in os.walk(root_dir):
# 拡張子でフィルタリング
target_files = [f for f in files if f.lower().endswith(TARGET_EXTENSIONS)]
if not target_files:
continue
print(f"\n--- フォルダ: {root} のファイルを処理中 ---")
# --- 処理対象のファイルを3種類に分類する ---
# 1. 既に「XX-」形式のファイル (変更しない)
# 2. 「XX 」または「XX_」形式のファイル (書式統一対象)
# 3. 曲番がないファイル (連番付与対象)
files_no_change = [] # XX-
files_to_rename = [] # XX や XX_
files_no_track = [] # 曲番なし
for f in target_files:
if TRACK_PATTERN_HYPHEN.match(f):
files_no_change.append(f)
elif TRACK_PATTERN_OTHER.match(f):
files_to_rename.append(f)
else:
files_no_track.append(f)
# --- 1. 変更しないファイル (XX-) の処理 ---
for filename in files_no_change:
print(f"Skipped: {filename} (既に XX- 形式)")
# --- 2. 書式統一ファイル (XX や XX_) の処理 ---
for old_filename in files_to_rename:
name, ext = os.path.splitext(old_filename)
match = TRACK_PATTERN_OTHER.match(name)
# 曲番と区切り文字を取得し、曲名部分を抽出
track_prefix = match.group(0) # 例: "01 " または "02_"
name_stem = name[len(track_prefix):].lstrip()
# 新しいファイル名を作成: 既存の番号 + ハイフン + 曲名
# 例: "01 " -> "01-"
new_filename = track_prefix[:2] + "-" + name_stem + ext
old_filepath = os.path.join(root, old_filename)
new_filepath = os.path.join(root, new_filename)
try:
os.rename(old_filepath, new_filepath)
print(f"Renamed: {old_filename} → {new_filename} (書式統一)")
except Exception as e:
print(f"⚠️ エラー発生: {old_filename} のリネームに失敗しました。エラー: {e}")
# --- 3. 曲番なしファイル (連番付与対象) の処理 ---
# **曲番がないファイル**にのみ、連番を付与します。
# このリストは os.walk の順 (ファイルシステム上の順) のまま処理します。
# 既存のファイル数に基づいて連番のスタート値を決定
# 全体で何番目から始まるかではなく、この「曲番なし」のリスト内で1から振り直す。
# (重要) 最終的にリネームされるファイル名が既存のファイル名と衝突しないように、
# ファイルリスト全体で未使用の連番から始める方が安全ですが、
# ご要望が「ソート順で連番付与」であるため、ここではファイルリストの出現順に連番を振ります。
# なお、通常、WindowsやmacOSのファイルシステムはファイル名をアルファベット順に返す傾向があるため、
# 結果的にアルファベット順になることが多いです。
for i, old_filename in enumerate(files_no_track, start=1):
name, ext = os.path.splitext(old_filename)
new_track_number = f"{i:02d}-" # 新しい曲番 (例: 01-, 02-)
new_filename = new_track_number + name + ext
old_filepath = os.path.join(root, old_filename)
new_filepath = os.path.join(root, new_filename)
try:
os.rename(old_filepath, new_filepath)
print(f"Renamed: {old_filename} → {new_filename} (連番付与)")
except Exception as e:
print(f"⚠️ エラー発生: {old_filename} のリネームに失敗しました。エラー: {e}")
# スクリプトの実行
if __name__ == "__main__":
if os.path.isdir(folder_path):
# 実行前に最終確認を促すメッセージ
print("====================================================")
print("⚠️ 警告: ファイルリネーム処理を開始します。")
print(" 必ず対象フォルダのバックアップを取ってください!")
print(" 続行するには 'y' を入力してください。")
print("====================================================")
confirmation = input("続行しますか? (y/N): ")
if confirmation.lower() == 'y':
rename_files_recursively(folder_path)
print("\n✅ 全ての処理が完了しました。")
else:
print("\n❌ 処理をキャンセルしました。")
else:
print(f"❌ 指定されたフォルダパスが見つかりません: {folder_path}")
# ==============================
## 🔎 疑問点に対する回答と確認事項
### 1\. 「ソート禁止」について
* **対応済**: スクリプトから`sorted()`関数を削除しました。
* **影響**:
* **既存の曲番付きファイル**: 曲番がそのまま維持されるため、欠番があっても連番の振り直しは行われず、ご要望通りになります。
* **曲番なしファイル**: ファイルシステムが返す順序(多くの場合アルファベット順)に基づいて連番が付与されます。
### 2\. 「先頭3ケタ」以外にハイフンがあっても大丈夫か?
* **対応済**: 正規表現はファイル名の**先頭**のみをチェックしています。
* `TRACK_PATTERN_OTHER = re.compile(r"^(\d{2})[\s_]")`
* `01_本日は_晴天なり` というファイル名の場合、先頭の `01_` にのみマッチし、ファイル名からその部分を削除して `01-` を付与します。
* 結果は `01-本日は_晴天なり` となり、途中の `_` は変更されません。**絶対禁止**の動作は発生しません。
### 3\. 他の処理について質問はありますか?
はい、以下の点について確認させてください。
* **欠番の再連番**: **曲番なしファイルが複数ある場合**、これらを連番で処理しますが、もし「曲番なし」ファイルを**フォルダ内のアルファベット順に並べ替えたい**場合は、`files_no_track` リストの処理の前に `files_no_track.sort()` を入れる必要があります。このままでよろしいでしょうか?
* **曲番の桁数**: 現在、`XX` の2桁のみを対象としています。リッピングするアルバムは2桁で収まる(最大99曲)という認識でよろしいでしょうか?(例: `00-`, `01-`, ..., `99-`)
* **ファイル名の大文字・小文字**: 拡張子は大文字・小文字の区別なく処理していますが、ファイル名自体は大文字・小文字を区別してリネームしています。
このスクリプトと確認事項について、ご意見をお聞かせください。
# ==============================
感謝である
おんらいん ばっくあっぷ
じじぃ~