適材適所

PowerShellやVBAなどプログラミング系の話多めで

【PowerShell】ファイルやフォルダ名を変更する【Rename-Item】

yyyy-mm-dd形式 VS yyyymmdd形式 VS・・・

ファイルサーバーを覗いてみると、

20210102〇〇.xlsx 20200702〇〇.txt

また別のフォルダを覗いてみると

2020-10-11〇〇.txt 2017-08-22〇〇.pdf

バラバラな表記。

ファイルやフォルダが作られた日付を判別するために

ファイルの頭に年月日を付ける人も多いかと思います。

私はyyyymmdd_で統一する派ですが、

yyyy-mm-dd の人もいます。

また、yymmdd-派の人もいます。

フォルダの中では統一されていることがほとんどですが

別のフォルダを見ると違う形式だったりとみんなバラバラなんてことも。

また、ファイルサーバを運用していると、〇〇BOOKと〇〇Bookであったり、

()と()であったりと同じようなファイル名に見えて、微妙に表記がゆれていることがあります。

この状態ってなんとなく気持ち悪い・・・。

表記を統一したい・・・。

でも、いちいち手動で統一するのは大変。

そんなときはPowerShellの力を借りて一発で統一してしまいましょう。

Rename-Itemコマンドレット

そんなときに便利なのが、Rename-Itemコマンドレットです。

Rename-Itemコマンドレットは読んで字のごとく、

名前を付けなおすためのコマンドレットです。

使い方はとっても簡単。

PS > Rename-Item -Path '.\old.txt' -NewName 'new.txt'

この例では、old.txtをnew.txtに変名しています。

-Pathで変名したいファイルパスを指定して、-NewNameで新しい名前を指定するだけです。

このコマンドレットの便利なところは、変名た対象のパスをパイプで受け取れるところ。

それを利用すればファイル名やフォルダ名をワンライナーで変換することができます。

ファイル名やフォルダ名を一括で変更する

yyyy-mm-ddをyyyymmddに変更する

例えば、yyyy-mm-ddという接頭辞をyyyymmddに変更するときは、

PS >dir -Recurse |?{$_ -match '^((\d{4})-(\d{2})-(\d{2})_)(.*)'}|Rename-Item -NewName ('{0}{1}{2}_{3}' -f $Matches[2],$Matches[3],$Matches[4],$Matches[5])

正規表現と組み合わせると自由自在にファイル名を変更することができます。

$Matches変数には-match演算子で一致した部分が格納されます。

また()でくくることで、それらの一致も$Matches変数に格納されます。

変更したい部分を正規表現で抽出し、必要な部分は$Matches変数に格納します。

そして、文字列書式と-f演算子を使って新しいファイル名を作っています。

yyyymmdd形式以外に変更したい場合は、

{0}{1}{2}_{3}の部分を変更します。

例えばyyyy-mm-ddファイル名としたい場合は{0}-{1}-{2}{3}とします。

Rename-Itemコマンドレット自体は簡単なのですが、

もしかすると正規表現が一見複雑なので、そっちで躓いてしまうかも知れません・・・。

ネットを漁ると、正規表現について懇切丁寧に解説してくれているサイトも

たくさんありますのでそちらを見てもらうのがいいかと・・・。

また、$Matches変数も何がどういう順番で格納されるのか、

実際に変数の中身を表示させながら実行してみてください。

yyyymmdd_をyyyy-mm-ddに変更する

先ほどとは逆にyyyymmdd_をyyyy-mm-ddに変更するときは

正規表現の部分を少し変更すれば可能です。

PS >dir -Recurse |?{$_ -match '^((\d{4})(\d{2})(\d{2})_)(.*)'}|Rename-Item -NewName ('{0}-{1}-{2}_{3}' -f $Matches[2],$Matches[3],$Matches[4],$Matches[5])

終わりに

Rename-Itemコマンドレットについて紹介しました。

このコマンドレットを使うときは正規表現をセットで使えると

すごくエレガントなシェル芸ができると思います。

私もまだまだ未熟者ですが・・・。

正規表現についてはテキスト片手になんとかやっている感じです。

ぜひRename-Itemのパイプ処理と正規表現でファイルサーバー内を

キレイにしてあげてください。

というわけで、ここまでお読みいただき、ありがとうございました。