画像や音楽データを整理していると、一括でファイル名を変更したくなる場面があります。
私の場合はかつて採用していたファイル命名ルールに問題があることが分かり、新しく決めたファイル命名ルールに更新したくなるというケースが多いです。
リネーム用ツールなども色々あるとは思うのですが、柔軟に運用できるという点でこういう時はPowershellの出番です。
Powershellによるファイルのパラメータ取得
Powershellでリネームを行う場合は”Get-Childitem”コマンドレットを使うのが一般的ではないかと思います。このコマンドレットはフォルダ内のファイルのパラメータを一括取得してくれます。私はもっぱらファイルやフォルダの処理に使いますが、レジストリハイブや証明書ストアにも使えるそうです。
今回はC:\Photoに入っているyyyymmdd.jpgという命名ルールで名前のついている画像データをyymmdd.jpgに変更するという場面を想定します。
まず、フォルダ内のjpgファイルの情報を取得するには以下の通りの記述でOKです。
[Powershell]
Get-Childitem "C:\Photo" *.jpg
拡張子を指定するとその拡張子に当てはまるファイルだけのパラメータを取得できます。
Powershellによるパイプライン接続
次にリネーム処理を行うためのパイプライン接続を行います。パイプラインというのはちょっと難しそうですが、連続した処理を行う際に1つ目の処理と2つ目の処理を接続する役割を果たします。
例えば、 フォルダ内のファイル名を取得する→特定のファイル名でフィルタする→結果をcsv出力する といった処理があった場合、矢印部分にパイプライン処理が使われます。記述は簡単で、専用の演算子”|”を入れるだけです。
Powershellによるリネーム
リネームを行います。取得されたファイル名のデータはパイプライン経由で使用できます。パイプライン経由のデータは自動変数”$_”に格納されているので、この変数に対して処理を行えば大丈夫です。
ファイルのリネームの場合は”Rename-Item”コマンドレットが使えます。コードはこんな感じになります。
[Powershell]
Get-Childitem "C:\Photo" *.jpg | Rename-Item -NewName {$_.Name -replace "20", ""}
自動変数のNameパラメータに対して”20″を””(空)に置き換える処理を行っています。
正規表現の利用
yyyyが必ず20で始まれば上の例で大丈夫ですが、例えば19で始まるものが入っている可能性もあるという場合は記述方法を変える必要があります。
幸い、Powershellは正規表現が使えるので、条件をうまく設定してあげれば様々な文字列パターンをキャプチャして置き換えできます。
今回は文字列の先頭かつ数字2桁なのは間違いないので、以下のように設定しました。
[Powershell]
Get-Childitem "C:\Photo" *.jpg | Rename-Item -NewName {$_.Name -replace "^[0-9]{2}", ""}
こんな感じでOKです。
ちょっと応用編でBeatportでダウンロード購入したトラックデータだと、ファイル名先頭にIDと思しき数字7桁とアンダースコアがついています。この場合は、
[Powershell]
Get-Childitem "C:\Photo" *.jpg | Rename-Item -NewName {$_.Name -replace "^[0-9]{7}_", ""}
これで置き換えられます。
正規表現についてはMicrosoftにリファレンスがあるので、見ながら色々な条件を試してみると面白いです。
正規表現について
[Microsoft Docs]