renameの代りにPowerShellを使う


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

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

さて、プロンプトで名前を入れ替えするコマンド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の一文字が、$&に格納されるので、両脇に[]がつけた形に変更されました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA