AIでファイル名の一括変更案を確認する方法|衝突・予約名・拡張子を分ける

架空8件の変更案を文字列だけで検査。大文字小文字の衝突、変更しない既存名、CON.txt、禁止文字、末尾空白、拡張子変更を元名と対応づけます。

AIものさし編集部

AIでファイル名の一括変更案を作るときは、命名規則に合うかだけでなく、変更先が重複しないか、変更しない既存ファイルへぶつからないかを確認します。名前が整った一覧でも、そのまま実行すると上書きや取り違えにつながる場合があります。

この記事では、架空の8件の変更案を、問題あり・確認保留・名前確認の候補へ分けます。実ファイルの読取りや名前変更、上書き、画像変換は行いません。成果物は、元の名前と変更先、止める理由を対応づけた計画表です。

対象フォルダと、名前の扱いを先に決める

今回の例は、同じフォルダ内のファイル名だけを扱います。サブフォルダへの移動、パス全体の長さ、リンク先の更新、クラウド同期は対象外です。計算には英数字中心の架空名を使い、大文字小文字を区別しない比較を計画上のルールにします。

MicrosoftのWindows向け公式資料は、大文字小文字の区別を仮定しないこと、使えない文字、CONなどの予約名、末尾の空白やピリオドを避けることを説明しています。同時に、ファイルシステムや名前空間で条件が異なることも示しています。Microsoft:ファイルとパスの命名(新しいタブで開く)

以下はWindowsでの一般的な名前の注意を参考にした、限定した事前確認です。すべてのOS・ファイルシステム・同期サービスへ共通の有効名を保証するものではありません。実際の保存先、共有先、同期先で必要な条件を別に確認します。

変更しないファイルも、衝突確認へ含める

変更対象8件のほかに、同じ架空フォルダへreadme.txtが存在し、これは変更しない設定とします。変更予定の行だけを見ると、この既存名を見落とします。

表は横にスクロールできます

計画ID元の名前変更案この例での確認
F01report-a.txtReport.txtF02の変更先と大文字小文字を除いて同じ
F02report-b.txtreport.txtF01の変更先と大文字小文字を除いて同じ
F03notes.txtCON.txt予約名CONに拡張子を付けた形
F04draft.txtsummary?.txt疑問符を含む
F05photo.jpgphoto.png拡張子が変わる。内容の変換とは別
F06memo.txtmemo.txt 末尾に空白がある
F07faq.txtreadme.txt変更しない既存ファイルと同名
F08final.txtfinal-approved.txtこの例の名前検査では問題なし

F01とF02は、文字列が完全一致していないため見逃しやすい組です。今回の比較規則では同じ変更先として扱い、どちらも止めます。先に実行した方を残す、後の方に勝手に連番を付ける、といった修正は行いません。

F07も、元ファイルfaq.txtの内容で既存readme.txtを置き換えてよい根拠はありません。名前変更案の作成と、既存ファイルの上書き許可を分けます。F08は、この限定した検査を通っただけで、実行許可や参照先への影響確認を終えた意味ではありません。

拡張子を変える案は、名前の整形と分ける

F05のphoto.jpgをphoto.pngへ変える案は、表示する拡張子の変更です。この一覧には、画像の内容をPNGへ変換する処理はありません。名前が.pngになったことだけで、画像形式が変わったとは報告しません。

今回は拡張子変更を確認保留にします。内容を変換したい依頼なら、出力形式、画質、透過、メタデータ、元ファイル保持などを別工程で決める必要があります。名前だけをそろえる依頼に、内容変換を無断で加えないでください。

F06の末尾空白も、AIが出力した表では見えにくいことがあります。文字列を引用した表示や、末尾空白の注記を付けて確認します。確認のための表示を変えても、元の変更案そのものを黙って修正しません。

状態は、元の8件へ一つずつ対応させる

この例ではF01・F02・F03・F04・F06・F07の6件が問題あり、F05の1件が拡張子変更の確認保留、F08の1件が名前確認の候補です。変更先の重複は1組・2件です。

「6件の問題」を「6組の衝突」とは言いません。2件は同じ重複組に属し、ほかは予約名、禁止文字、末尾空白、既存名との衝突です。問題の種類と元計画IDを残すと、担当者がどの条件を直すべきか確認できます。

実務では、同じファイルが一覧へ二度入る、元の名前がすでに存在しない、別フォルダの同名を混ぜるなど、入力一覧自体の確認も必要です。元のパスや管理IDを保持し、表示名だけで別ファイルをまとめないようにします。

掲載例の名前と件数を検算する

次のPythonは、文字列の一覧だけを検査します。ファイル操作の関数は呼びません。問題のある名前を修正したり、変更を実行したりするコードではありません。

from collections import Counter
from pathlib import PurePosixPath

plans = [
    ("F01", "report-a.txt", "Report.txt"),
    ("F02", "report-b.txt", "report.txt"),
    ("F03", "notes.txt", "CON.txt"),
    ("F04", "draft.txt", "summary?.txt"),
    ("F05", "photo.jpg", "photo.png"),
    ("F06", "memo.txt", "memo.txt "),
    ("F07", "faq.txt", "readme.txt"),
    ("F08", "final.txt", "final-approved.txt"),
]
untouched = {"readme.txt"}
targets = Counter(dst.lower() for _, _, dst in plans)
reserved = {"CON", "PRN", "AUX", "NUL"}
reserved |= {f"{prefix}{n}" for prefix in ("COM", "LPT") for n in range(1, 10)}
result = {}
reasons = {}
for plan_id, src, dst in plans:
    issues = []
    if targets[dst.lower()] > 1:
        issues.append("TARGET_DUPLICATE")
    if dst.lower() in {name.lower() for name in untouched}:
        issues.append("EXISTING_UNTOUCHED")
    if dst.split(".", 1)[0].upper() in reserved:
        issues.append("RESERVED")
    if any(c in '<>:"/\\|?*' or ord(c) < 32 for c in dst):
        issues.append("INVALID_CHARACTER")
    if dst.endswith((" ", ".")):
        issues.append("TRAILING_SPACE_OR_DOT")
    reasons[plan_id] = issues
    if issues:
        result[plan_id] = "BLOCKED"
    elif PurePosixPath(src).suffix.lower() != PurePosixPath(dst).suffix.lower():
        result[plan_id] = "REVIEW_EXTENSION"
    else:
        result[plan_id] = "NAME_CANDIDATE"
assert result == {
    "F01": "BLOCKED", "F02": "BLOCKED", "F03": "BLOCKED",
    "F04": "BLOCKED", "F05": "REVIEW_EXTENSION", "F06": "BLOCKED",
    "F07": "BLOCKED", "F08": "NAME_CANDIDATE",
}
assert Counter(result.values()) == {"BLOCKED": 6, "REVIEW_EXTENSION": 1, "NAME_CANDIDATE": 1}
print(result, reasons)

掲載例を実行し、別の検算でも変更先ごとに計画IDを対応づけ、Report.txt/report.txtの2件、変更しないreadme.txtとの衝突、状態別の6・1・1件を確認しました。PurePosixPathはこの例で拡張子部分を比較するために使い、実際のWindowsパスを検査したものではありません。

コードは、空の名前、全種類の予約名表記、Unicodeの正規化、名前やパスの長さ、元ファイルの存在、権限などを網羅していません。対象は表の固定した8件です。文字列の検算が通ったことを、OS上で改名できた証拠にはしません。

AIには、実行より対応表と修正案を返させる

架空の8件のファイル名変更案を事前確認してください。
同じフォルダで、大文字小文字を区別しない比較をする例です。
変更しない既存名readme.txtも衝突確認へ含めてください。
元計画ID、元の名前、変更案、問題の種類、確認事項を返してください。
変更先の重複は両行を止め、連番付与や上書きを勝手に選ばないでください。
拡張子変更を内容の形式変換と書かず、確認保留へ分けてください。
名前の確認候補を実行許可や変更完了と書かないでください。
ファイルの読み書き、改名、移動、削除、変換は行いません。

依頼文と表は手製で、AIの実行結果ではありません。修正案を採用する場合も、新しい変更先で重複と既存名を再確認します。元名と変更後の対応が失われるような置換をしないでください。

実際の変更前には、影響するリンク、参照する文書やアプリ、同期先、復元方法を確認します。名前を入れ替えるような循環や、変更先が別の変更対象の元名でもある場合は、実行順も別途設計します。今回の計画表は、その実行手順を作成・検証したものではありません。

参考資料

公式資料の確認日:2026年10月20日。名前、既存一覧、計画、判定条件、依頼文は独自の架空例です。掲載コードと独立した変更先照合をローカルで検査しました。実ファイル、AI処理、OS上の改名、内容変換、リンクや同期、権限、復元、画面表示は未検証です。

質問から自分に合うAIを探す