renameの代りにPowerShellを使う(-Replace)

TVアニメ「極黒のブリュンヒルデ」プロモーション映像

アニメ『極黒のブリュンヒルデ』(2014)

幼馴染と再会したと思ったら、その子は首の後ろに自爆スイッチがついてる「魔法使い」に改造されてて、なんだか切ない話。一日一日を大切に生きないといけないですね。「魔法使い」の能力は、様々でしたが、カズミのコンピュータを使う能力とか、小鳥の自分と他人を入れ替える「転位」の魔法が気にいりました。面白かったので、漫画も購入する予定。

さてWindowsのコマンドプロンプトで複数ファイルの名前を入れ替えたいときに、重宝するコマンドrenameってのがあります。
ちょっと使ってみます。

まずはテンポラリディレクトリを作成。

C:\Users\takk>mkdir tmp
C:\Users\takk>cd tmp
C:\Users\takk\tmp>

適当にファイルを作ります。

C:\Users\takk\tmp>for /l %i in (1,1,6);do @echo HELLO>file_%i.txt

6ファイルできました。

C:\Users\takk\tmp>dir /b/s
C:\Users\takk\tmp\file_1.txt
C:\Users\takk\tmp\file_2.txt
C:\Users\takk\tmp\file_3.txt
C:\Users\takk\tmp\file_4.txt
C:\Users\takk\tmp\file_5.txt
C:\Users\takk\tmp\file_6.txt

C:\Users\takk\tmp>

では、renameします。拡張子のtxtをbinに変更。

C:\Users\takk\tmp>rename file*.txt file*.bin

C:\Users\takk\tmp>dir/b/s
C:\Users\takk\tmp\file_1.bin
C:\Users\takk\tmp\file_2.bin
C:\Users\takk\tmp\file_3.bin
C:\Users\takk\tmp\file_4.bin
C:\Users\takk\tmp\file_5.bin
C:\Users\takk\tmp\file_6.bin

C:\Users\takk\tmp>

次は、ファイル名のfile_をtest_に変更。

C:\Users\takk\tmp>rename file*.bin test*.bin

C:\Users\takk\tmp>dir /b/s
C:\Users\takk\tmp\test_1.bin
C:\Users\takk\tmp\test_2.bin
C:\Users\takk\tmp\test_3.bin
C:\Users\takk\tmp\test_4.bin
C:\Users\takk\tmp\test_5.bin
C:\Users\takk\tmp\test_6.bin

C:\Users\takk\tmp>

このようにrenameは一見簡単に使えるのですが、ディレクトリ構成が複雑な場合に、対応できません。
次はPowerShellでファイル名置換してみます。

ファイルを削除した後、 以下のようにランダムにディレクトリ作成します。

C:\Users\takk\tmp>powershell "1..6 |
 %{$n=1}{$r=random;
$dir=$r -replace('(..)','$&\\');
mkdir $dir |
 out-null;
1..4 | %{echo $_'     '$r >> $dir/file_$n.txt};
$n++
}"

ディレクトリの深い階層にfile_1.txt~6.txtまで作りました。

C:\Users\takk\tmp>powershell "gci -r -n -include *.txt"
14\06\78\26\71\file_4.txt
14\55\90\38\9\file_5.txt
19\51\76\09\09\file_2.txt
20\65\59\82\30\file_3.txt
51\55\94\62\2\file_1.txt
61\41\04\04\8\file_6.txt

さて、ファイル名を変更してみます。file_1.txt~3.txtをtmp.binというファイル名に変更します。

C:\Users\takk\tmp>powershell "gci -r -n -include *[123].txt |
%{ren $_ tmp.bin}"

確認してみましょう。

C:\Users\takk\tmp>powershell "gci -r -n -include *.txt,*.bin"
14\06\78\26\71\file_4.txt
14\55\90\38\9\file_5.txt
19\51\76\09\09\tmp.bin
20\65\59\82\30\tmp.bin
51\55\94\62\2\tmp.bin
61\41\04\04\8\file_6.txt

C:\Users\takk\tmp>

3ファイルがtmp.binになりました。

次は、拡張子txtをcに変更します。

C:\Users\takk\tmp>powershell "gci -r -n -include *.txt |
% {ren $_ $($(split-path -leaf $_) -replace 'txt','c')}"

確認します。

C:\Users\takk\tmp>powershell "gci -r -n -include *.*"
14\06\78\26\71\file_4.c
14\55\90\38\9\file_5.c
19\51\76\09\09\tmp.bin
20\65\59\82\30\tmp.bin
51\55\94\62\2\tmp.bin
61\41\04\04\8\file_6.c

C:\Users\takk\tmp>

簡単ですね。

正規表現を使って置換もできます。

C:\Users\takk\tmp>powershell "gci -r -n -include *.* | % { ren $_ $($(split-path
 -leaf $_) -replace '[56]','[$&]')}"

C:\Users\takk\tmp>powershell "gci -r -n -include *.*"
14\06\78\26\71\file_4.c
14\55\90\38\9\file_[5].c
19\51\76\09\09\tmp.bin
20\65\59\82\30\tmp.bin
51\55\94\62\2\tmp.bin
61\41\04\04\8\file_[6].c

C:\Users\takk\tmp>

5または6の一文字が、$&に格納されるので、両脇に[]がつけた形に変更されました。

コメント

タイトルとURLをコピーしました