【bat】バッチファイルでフォルダを再帰的に処理する方法

bat

バッチファイルではフォルダを再帰的に処理することで、サブディレクトリを含む全体のファイルやフォルダに一括で操作を適用できます。例えば「特定の拡張子のファイルを探して処理する」「階層をまたいでコピーする」といった用途に役立ちます。本記事では再帰処理の基本から応用例までを解説します。

for /R コマンドを使った再帰処理

バッチファイルで再帰的にフォルダを処理するには for /R を使います。指定したフォルダを起点に、サブフォルダを含めてすべてのファイルに対して繰り返し処理が行えます。

@echo off
setlocal

:: C:\test フォルダ以下の全ファイルを列挙
for /R "C:\test" %%f in (*) do (
    echo %%f
)

endlocal
pause

この例では C:\test 以下のすべてのファイルパスが出力されます。

特定の拡張子を対象にする

ワイルドカードを指定すれば、特定の種類のファイルだけを対象にできます。例えば「.txt ファイルだけを処理する」場合は以下のように記述します。

@echo off
setlocal

for /R "C:\test" %%f in (*.txt) do (
    echo TXTファイル: %%f
)

endlocal
pause

サブフォルダ自体を処理する

ファイルではなくフォルダ単位で処理したい場合は for /D を使います。これに /R を組み合わせると再帰的にすべてのフォルダを走査できます。

@echo off
setlocal

for /R "C:\test" /D %%d in (*) do (
    echo フォルダ: %%d
)

endlocal
pause

処理の応用例:ファイルのコピー

再帰処理を利用して、特定の拡張子のファイルをまとめてコピーする例です。

@echo off
setlocal

set "src=C:\test"
set "dst=C:\backup"

for /R "%src%" %%f in (*.log) do (
    echo %%f をコピー中...
    copy "%%f" "%dst%" >nul
)

endlocal
pause

処理の応用例:ファイルの削除

再帰的に指定した種類のファイルを削除することもできます。誤操作を防ぐため、まずは echo で確認してから実際の del を使うのが安全です。

@echo off
setlocal

for /R "C:\test" %%f in (*.tmp) do (
    echo 削除対象: %%f
    :: 実行する場合は以下のコメントアウトを外す
    :: del "%%f"
)

endlocal
pause

まとめ

バッチファイルでフォルダを再帰的に処理するには for /R を使うのが基本です。特定の拡張子やフォルダ単位の処理、コピーや削除などの応用も容易に記述できます。大規模なファイル操作を行う前には echo 出力で対象を確認してから本処理を有効化するのが安全な運用方法です。