フォルダ内のファイルすべての頭にフォルダ名を付ける

投稿者: | 2022年3月21日

Windows の DOS コマンドで、フォルダ内にあるファイルすべての頭にフォルダ名を付加する方法

とあるフォルダにあるファイルのすべてのファイル名の頭に、(接頭辞として)そのフォルダ名をつけたい、という場合です。

例えば、「ポリオミノ」というフォルダがあり、その中にいくつものファイルがあるとしたら、全部にポリオミノをつけて、「ポリオミノ_10_アクアテラリウム.wav」とか「ポリオミノ_11_三つ葉の結びめ.wav」に rename したい場合のやり方です。

最初に結論

コマンドプロンプトでやりたい場合


for /d %a in ( * ) do (
pushd %a
forfiles /M * /c “cmd /c rename @file %a_@file”
popd
)

バッチにしたい場合


@echo off
for /d %%a in ( 0* ) do (
pushd %%a
forfiles /M * /c “cmd /c rename @file %%a_@file”
popd
)

コマンドでやってみた例

実施前のフォルダはこのような状態です。

コマンドを入力します

結果は以下のようになります。

少し解説

まず、コマンドプロンプトでやる場合は、1行ずつ入力していきます。
コマンドプロンプトとバッチの場合で、変数として使用するフォルダ名は、 %a と %%a と表記が違うので注意してください。
バッチの場合は、 %%a としないと動きません。
aでなくてiでもなんでもいいですが、%の数が違う点に注意です。

実行するのは「フォルダのひとつ上の階層であること」
再帰的にフォルダをだどって2階層下までやってくれるものではありません。


for /d %a in ( * ) do (

ここの * を、自分でファイル名にした場合 ( TABを押してファイル名を入れることができます ) そのフォルダしかやりません。直下に、複数フォルダある場合は、すべてのフォルダに対して作業をしてくれる ( やってしまう ) ので、どの範囲で作業をしたいのかによって、ファイル名指定をするかどうかを選んでください。

例えば、ファイル名が「001」「002」「003」となっている場合なら、


for /d %a in ( 0* ) do (

などとしておけば、フォルダを限定できるので事故が減る可能性もあります。


forfiles /M * /c “cmd /c rename @file %a_@file”

ここで、 /M のあとに * を指定しているのですべてのファイルを実行してしまいますが、JPEG ( jpgの拡張子を持つもの ) だけ変更したいなどというケースなら、


forfiles /M *.jpg /c “cmd /c rename @file %a_@file”

などと、 /M のあとの * を拡張子指定してあげるほうが確実です。

また、フォルダ名のあとに、アンダースコアをつけているので、 %a_@file となっています。

バッチを汎用的にする


@echo off
for /d %%a in ( %1 ) do (
pushd %%a
forfiles /M %2 /c “cmd /c rename @file %%a_@file”
popd
)

このようにしてあげれば、ひとつ目の引数が対象とするフォルダ、ひたつ目が対象とするファイルにできます。renamefolder.bat としてパスを張ったところに入れておき、「変更したいフォルダの直上のフォルダで実行します。


renamefolder * *.wav

という感じにやれば、変更が可能です。