ファイル名だけを使った非破壊プレビュー
このツールがブラウザ上で扱うのは,変更候補となるファイル名の文字列です.画面左の入力欄へ1行に1つずつ名前を貼り付けるか,ファイル選択ボタンから複数のファイルを選びます.ファイルを選んだ場合も実装が参照するのはFileオブジェクトのnameプロパティだけで,ファイル本文を読み取って変換する機能や,ブラウザから直接名前を書き換える機能はありません.
入力はWindowsで一般的なCRLFと,macOSやLinuxで一般的なLFの改行に対応して分割されます.空白だけの行は対象から外しますが,実在する名前の先頭や末尾に空白がある場合,その空白を黙って削除して別名にすることはありません.後段の検査で問題として示し,利用者が意図を確認できるようにしています.
右側の「リネームシミュレーター」には,行番号,変更前,変更後の3列が表示されます.ルールによって名前が変わる行は変更後の文字が強調され,条件に一致しない行は元の名前のままです.初期例のdocument_01.txtとdocument_02.txtに対して,検索文字列document,置換後docを指定した状態では,doc_01.txtとdoc_02.txtを確認できます.
この時点では実際のファイルには何も起こりません.まず全行の結果を目で確認し,その後に必要なら変更後リストをコピーするか,実行用スクリプトを保存する,という二段階の使い方です.
4種類の変更ルールと拡張子の扱い
「文字列置換」は,指定した文字列と一致する箇所を同じファイル名の中ですべて置換します.例えばdocument_document.txtでdocumentをdocへ置き換えると,doc_doc.txtになります.正規表現ではなく文字そのものを探すため,ピリオドや丸括弧を特別な記号として考える必要はありません.検索文字列が空の場合は変更を行いません.
「正規表現」は,ブラウザのJavaScript正規表現をグローバル指定で使います.photo_(.*)を検索し,image_$1を置換側に指定すれば,photo_holiday.pngの一致部分を利用した名前を組み立てられます.$1や$2は丸括弧で捕捉した部分を再利用する後方参照です.
正規表現の文法が誤っている場合は,元名へ黙って戻すのではなく「正規表現を解析できません」と表示し,スクリプトの保存も止めます.複雑な式は意図しない範囲まで一致しやすいため,数行の例で結果を確かめてから対象を増やすのが適切です.
「連番付与」は,入力順を基準に,接頭辞,開始番号,桁数,接尾辞を組み合わせます.開始番号1,3桁,接頭辞file_なら,file_001,file_002という順です.photo.jpgのように末尾側にピリオドがある名前は,最後のピリオド以降を拡張子として保持するため,file_001.jpgになります.
archive.tar.gzは最後の.gzだけを拡張子として扱い,file_001.gzになります.複合拡張子全体を残したい場合は,この仕様を踏まえて文字列置換または正規表現を選びます.
「大小文字」は,拡張子を除いた本体をすべて小文字または大文字へ変えます.My.Photo.JPGを小文字化するとmy.photo.JPGとなり,拡張子.JPGの表記は維持されます.先頭のピリオドしか持たない.gitignoreのような名前は,ピリオド以降を拡張子として分離しません.連番では拡張子なしの名前として扱われ,大小文字では名前全体が変換対象になります.
保存前に行う名前・重複・衝突の検査
プレビューを表示できても,その結果をそのまま実行用スクリプトへ出力できるとは限りません.変更される行が1件もない場合,正規表現が無効な場合,または入力が空の場合は保存ボタンを無効にします.問題があるときは最大3件の理由を画面に示し,それを超える分は残り件数を表示します.名前を自動で削ったり番号を足したりはしないため,入力またはルールを利用者が修正します.
個々の変更前名と変更後名については,空名,「.」「..」,先頭・末尾の空白,末尾のピリオド,パス区切り,制御文字,Windowsで使用できない記号を検査します.CON,PRN,AUX,NUL,COM1からCOM9,LPT1からLPT9で始まるWindowsの予約名も対象です.
さらに,PowerShellが引用符として扱う湾曲したスマートクォートは,生成コードの解釈が曖昧になるのを避けるため受け付けません.これらは全OSで使えない文字の完全な一覧という意味ではなく,BashとPowerShellの両方へ同じ候補を出すための保守的な制限です.
リスト全体では,大文字小文字を区別せずに変更前の重複と変更後の重複を調べます.2つの元ファイルが同じ変更後名になる場合だけでなく,ある変更後名が別行の変更前名と一致する連鎖的な変更も止めます.このため,a.txtをb.txtへ,b.txtをc.txtへ順にずらすような処理は出力できません.中間名を使う複雑な入れ替えには対応せず,1回の処理で衝突しない組み合わせだけを対象とします.
Document.txtからdocument.txtのように大文字小文字だけを変える候補も保存を止めます.大文字小文字を区別するかどうかはOSだけでなく,使用するファイルシステムの設定にも左右されるからです.この制限は内容消失を断定するものではなく,異なる環境へ同じスクリプトを持ち込んだときの動作差を避けるための保守的な判断です.
Bashスクリプトの引用と上書き防止
検査を通過すると,macOSおよびLinux向けにrename_files.shを保存できます.出力対象は変更がある行だけです.スクリプトはBashを指定し,set -eを設定するため,終了ステータスが失敗となるコマンドが発生した場合は後続処理を続けません.
ファイル名はシェルの単一引用符で囲み,名前の中に単一引用符がある場合も,引用を閉じて引用符そのものを挿入し,再び引用を開く形へ変換します.これにより,空白,ドル記号,コマンド置換の形をした文字列などをコマンドではなく名前の一部として渡します.すべての相対名に./を付けるため,-nのようにハイフンで始まる名前もmvのオプションとして扱われません.
実際のmvを始める前に,変更対象となる元名が通常ファイルとして存在することと,変更先にファイルまたはシンボリックリンクが存在しないことを全件分確認します.1件でも条件を満たさなければ,その時点ではまだ名前を変更せずに終了します.事前検査を通過した後はmv -nで変更し,変更先を上書きしないようにします.各処理後には元のパスが残っていないかも確認し,残っていれば停止します.
保存したシェルスクリプトは対象ファイルと同じフォルダに置き,そのフォルダを現在位置にしたターミナルからbash rename_files.shとして実行する想定です.ブラウザから保存したファイルに実行権限が付いているとは限らないため,権限を付けずにBashへ明示的に渡すこの方法が分かりやすい手順です.コードを開き,列挙された変更前名と変更後名がプレビューと一致することを実行前に確認してください.
PowerShellスクリプトのリテラルパス処理
Windows向けには,従来のバッチファイルではなくrename_files.ps1を保存します.バッチ形式ではパーセント記号による変数展開など,ファイル名を安全にコードへ埋め込む際の条件が複雑になるためです.生成するPowerShellファイルはUTF-8 BOMとCRLF改行を用い,日本語を含むスクリプトをWindows PowerShellで開く際の文字コード互換性に配慮しています.
ただし,すべての端末設定での表示や実行を保証するものではありません.
冒頭でPowerShellのプリファレンス変数$ErrorActionPreferenceをStopに設定し,スクリプト自身があるフォルダへSet-Locationで移動します.元名は単一引用符の文字列にし,名前中の単一引用符は2個重ねます.Test-PathとRename-Itemでは-LiteralPathを使うので,角括弧などをワイルドカードとしてではなく,パスを構成する文字として扱います.
Bash版と同じく,最初に元の通常ファイルがすべて存在するか,変更先が存在しないかを全件確認します.条件に合わないときはthrowで停止し,確認が完了した後だけRename-Itemを順番に実行します.各Rename-Itemにも-ErrorAction Stopを付けています.
PowerShellの実行ポリシーや組織の端末管理設定によってps1の実行が許可されない場合があるため,その際は制限を無効化しようとせず,管理者が定めた手順を確認してください.
途中停止を前提にした実行手順と復旧準備
画面内の検査と,スクリプト実行時の事前検査は,入力時点で分かる衝突や既存ファイルへの上書きを減らすためのものです.しかし,事前検査と各リネームの間には時間差があります.その間に別のアプリが同名ファイルを作る,ファイルを使用中にする,アクセス権を変更する,といった状況までは固定できません.ファイルシステムの状態を一括してロックするトランザクションでもありません.
実行中に権限エラーや競合が起きると,その箇所で停止します.停止前に終わった名前変更は自動で元へ戻らないため,一部だけ新名,一部は旧名という状態になり得ます.その状態では,元ファイルがすべて存在することを調べる事前検査に通らず,同じスクリプトを単純に再実行できない場合があります.これは失敗を無視して続行しないための挙動ですが,自動ロールバック機能ではありません.
重要なファイルでは,まず対象フォルダを別の場所へ複製して復元可能なバックアップを用意します.次に,プレビュー表と保存したコードを比較し,少数の不要な複製ファイルで同じルールを試します.本番では同期アプリや対象ファイルを開くアプリの状態にも注意し,実行後は件数と代表的なファイルを確認します.
問題が起きた場合は再実行を繰り返す前に,どこまで変更されたかを実フォルダとスクリプトで照合してください.ブラウザでのプレビュー,保存前検査,実行時検査,利用者のバックアップを組み合わせて使うことが,このツールの現実的な運用方法です.