こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

特定ディレクトリ以下の複数のフォルダ名とファイル名を一括で連番にするバッチの作成

特定のフォルダ(ディレクトリ)以下の複数のフォルダ名とファイル名を
一括で連番にしてくれる方法(連番+拡張子のリネーム)を教えてください。
ソフトでは簡単ですが*.bat ファイルで実行するスクリプトを
知りたいので宜しくお願い致します

例えば

フォルダ0
├フォルダ1
│ ├ a.txt
│ ├ b.jpg
│ └ フォルダ2
│    └c.exe
└ フォルダ3
  └ d.exe

という構造があったとして

000000
├000001
│ ├ 000000.txt
│ ├ 000001.txt
│ └ 000000
│    └000000.txt
└ 000002
  └ 000000.txt

この様に特定ディレクトリ以下の複数のフォルダ名とファイル名を連番
(上記は6桁ですが001,002…など3桁などに対応できる)にしたいのです

以下の方法で特定のフォルダ内のファイルを.txtに変更まではできましたが、
特定のフォルダより下層のファイルを.txtに変更はできませんでした。

REN E:\フォルダ\フォルダ\*.* *.txt

上記のスクリプトは特定フォルダにあるファイルは拡張子の変更が出来ますが、
そのフォルダより下層の複数のフォルダ名とファイル名の拡張子の変更をできないので、
*.batファイルで連番+拡張子のリネームを一括でするスクリプトの明記をお願い致します。

ご存知の方、どの様なご意見でも構いませんので
ご回答頂けると幸いです。宜しくお願い致します。

投稿日時 - 2009-10-04 15:26:55

QNo.5341227

すぐに回答ほしいです

質問者が選んだベストアンサー

バッチでも再帰呼び出しできますよ。
元々ファイル名に000000.txtとかあればrenが失敗するケースも出てくるでしょうけど、そこは考慮してません。

@echo off
setlocal
rem 引数があればそのディレクトリに移って処理
if not "%~1"=="" pushd "%~1"
rem バッチファイル名を覚えておく
set X="%~dpnx0"
rem ファイルの処理
set F=1000000
for %%A in (*) do call :file "%%A"
rem ディレクトリの処理
set D=1000000
for /d %%A in (*) do call :dir "%%A"
goto :EOF

:file
rem バッチファイルならスキップ
if %X%=="%~dpnx1" goto :EOF
rem 連番下6桁にリネーム
ren %1 %F:~-6%.txt
set /a F+=1
goto :EOF

:dir
rem サブディレクトリ内部を処理
call %X% %1
rem 連番下6桁にリネーム
ren %1 %D:~-6%
set /a D+=1
goto :EOF

投稿日時 - 2009-10-04 23:17:30

補足

ご回答有難う御座います。
たとえば、「E:フォルダ\フォルダ」以下のフォルダとファイルを
一括で連番&拡張子にリネームしたい時はどういうスクリプトになりますか?

「E:フォルダ\フォルダ」のパスを入力する場所が分かりません。
宜しくお願い致します。

投稿日時 - 2009-10-05 00:00:59

お礼

たまにできないフォルダがあるのですが、ほとんどの場合
#5と組み合わせることでできました。
この度は質問に答えて下さり有難う御座いました。

投稿日時 - 2009-10-06 17:13:25

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

1ファイルに書き込んじゃうと変更が面倒だと思いますけど、まあ、前提が不明なので。

@echo off
setlocal
rem 引数があればそのディレクトリに移って処理
rem 引数が無ければ特定ディレクトリに移って処理
if not "%~1"=="" (pushd "%~1") else pushd "E:\abc\def"
~以下同じ

投稿日時 - 2009-10-06 00:40:25

補足

ご回答有難う御座います。
*.batを試したところ全てのファイルは連番+拡張子変更が出来ました。
ただ、ファイル名の連番変更ができないようです。

現在の状況は

例えば

フォルダ
├フォルダ
│ ├ a.txt
│ ├ b.jpg
│ └ フォルダ
│    └c.exe
└ フォルダ
  └ d.exe

という構造があったとして

フォルダ
├フォルダ
│ ├ 000000.txt
│ ├ 000001.txt
│ └ フォルダ
│    └000000.txt
└ フォルダ
  └ 000000.txt

以上のようにフォルダ名が連番に変更されません。
質問にあるような

000000
├000001
│ ├ 000000.txt
│ ├ 000001.txt
│ └ 000000
│    └000000.txt
└ 000002
  └ 000000.txt

のようにフォルダ名も連番にしたいのですが、
宜しければご教授ください。宜しくお願い致します。

@echo off
setlocal
rem 引数があればそのディレクトリに移って処理
rem 引数が無ければ特定ディレクトリに移って処理
if not "%~1"=="" (pushd "%~1") else pushd "E:\abc\def"
~以下#2スクリプトと全く変更なく同じ

というスクリプトですよね

投稿日時 - 2009-10-06 02:29:34

お礼

訂正
>ただ、ファイル名の連番変更ができないようです。
(正)ただ、『フォルダ名』の連番変更ができないようです。

投稿日時 - 2009-10-06 08:51:18

ANo.4

#2です。バッチファイルの実行の仕方がわからないと言うことですかね??

案1:目的のフォルダE:\aaa\bbbに、#2のバッチファイルを入れてクリック

案2:例えば、C:\foo.bat に#2のバッチファイルを書き込んで、もう一つC:\bar.batという名前で、

C:\foo.bat E:\aaa\bbb

という一行のバッチファイルを作って、それをクリック

案3:例えば、C:\foo.bat に#2のバッチファイルを書き込んで、コマンドプロンプトを開き、

C:\foo.bat E:\aaa\bbb

と打ち込んで、Enter
#3では案3のつもりで書きました。

質問意図と違っていたら、何に困っているのかもうちょっと詳しく。

投稿日時 - 2009-10-05 21:24:42

補足

ご回答有難う御座います。

案1や案2、案3のようにバッチファイルを移動したり、
2つファイルを用意したり、コマンドプロンプトを
立ち上げたりすると、複数のパスを指定する時に少々煩雑になります。

私の知りたいことは一つの*.batファイルに#2のスクリプトを
書き込んで、そのスクリプト内のパスを指定後、
この*.batをダブルクリックすれば実行できるという方法です。
(つまり、1つのバッチファイルのみで実行する方法です)

たとえば以下の#2のスクリプトで「E:\フォルダ\フォルダ\」以下の
フォルダ名とファイル名を変更する際に、上記のパスをどこに
入力すればよいかということです。私がやってみてダメだった
#2のスクリプトにパスを書き足したものを表示しておきます。

@echo off
setlocal
rem 引数があればそのディレクトリに移って処理
if not "%~1"=="" pushd "%~1"
rem バッチファイル名を覚えておく
set X="%~dpnx0"
rem ファイルの処理
set F=1000000
for "E:\フォルダ\フォルダ\" %%A in (*) do call :file "%%A"
rem ディレクトリの処理
set D=1000000
for /d "E:\フォルダ\フォルダ\" %%A in (*) do call :dir "%%A"
goto :EOF

:file
rem バッチファイルならスキップ
if %X%=="%~dpnx1" goto :EOF
rem 連番下6桁にリネーム
ren "E:\フォルダ\フォルダ\" %F:~-6%.txt
set /a F+=1
goto :EOF

:dir
rem サブディレクトリ内部を処理
call %X% %1
rem 連番下6桁にリネーム
ren "E:\フォルダ\フォルダ\" %D:~-6%
set /a D+=1
goto :EOF

以上のようにしましたが当然実行できませんでした。
上記の場合パスを入力した4箇所のみ修正をしていますが、
これを入力の手間を省く為1箇所にしたいのです。
もし宜しければご教授ください。宜しくお願い致します。

投稿日時 - 2009-10-06 00:21:08

ANo.3

#2です。
>「E:フォルダ\フォルダ」のパスを入力する場所が分かりません。

バッチの引数にディレクトリを指定してください。
C:\>foo.bat E:\qwer\asdf
みたいに。

投稿日時 - 2009-10-05 00:23:49

補足

バッチの引数はこのスクリプトでいうとどれになりますか?
「E:フォルダ\フォルダ」のパスを入力してスクリプトを
示して頂けるとわかるので宜しくお願い致します。

投稿日時 - 2009-10-05 01:25:08

お礼

調べても全く分かりませんし、できません…。

分かる方誰でも良いのでご存知の方は
「E:フォルダ\フォルダ」のパスを入力したスクリプト
を教えてください。宜しくお願い致します。

投稿日時 - 2009-10-05 15:48:15

ANo.1

ディレクトリの深さが不明の場合batで処理できるのでしょうか?
VBSのほうがこの処理に向いていると思います。(再帰呼び出しが可能だから)

投稿日時 - 2009-10-04 20:31:39

補足

特定フォルダ以下の下層のファイルサイズを変えることは
ディレクトリの深さが不明の場合でも処理できました。
ですから、リーネームや拡張子の変更の場合も*.bat(バッチ)で
処理できるのではないかと思い質問してみました。

投稿日時 - 2009-10-04 20:53:23

あなたにオススメの質問