【BAT】複数フォルダ内を拡張子で抽出してコピーや削除する方法

  • 0
    いいね
  • 0
    コメント

    はじめに

    あるフォルダを世代別バックアップしているため、フォルダ名に日時(yyyyMMddHHmmss)が付いた状態になっているが、配下のフォルダ構成は同じという状態で実績データ(CSVファイル)を取得したいという依頼があった。

    親フォルダの名前が違うというのが面倒なところで、ファイルエクスプローラーの検索のように「*.csv」とすれば、親フォルダに関係なくCSVファイルが抽出できればいいのだが、バッチによるやり方がピンと来なかった。
    以前、別件で同様のフォルダ構成でEXEのバージョンを取得してログ出力するVBSスクリプトを組んだこともあって、それを改変して作成した。

    目的のものを作り終えたが、バッチでもやり方があるのではないかと検索して、下記サイトに辿り着いた。
    指定した名前のディレクトリを再帰的に削除するコマンドライン - IIJIMASの日記

    対応

    このサイトの記事によれば、「FOR /R」とすることでサブフォルダーも処理対象に出来るとのこと。

    FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンド パラメーター]
    [ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
    ます。/R の後にディレクトリが指定されていない場合は、現在の
    ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
    ディレクトリ ツリーの列挙だけを行います。
    

    以下のようにすれば再帰的にフォルダを検索して処理コマンドを実行できるようです。
    "%%f"には、対象のファイル名がセットされる。

    for /R %%f in (フォルダ名) do 処理コマンド "%%f"
    

    ファイルコピー

    CSVファイルをtargetフォルダにコピーする。
    同一ファイルがあった場合、XCOPYのDオプションにより送り側の日付が受け側の日付より 新しいファイルだけをコピーします。

    for /R %%f in (*.csv) do xcopy /D /I /Y "%%f" target
    

    ファイル削除

    gitを使用していた作業フォルダを移す場合、邪魔なgitkeepとgitignoreファイルを一掃します。

    for /R %%f in (*.gitkeep, *.gitignore) do del /S /Q "%%f"
    

    フォルダ削除

    gitを使用していた作業フォルダを移す場合、邪魔なgitフォルダとVisual Studioのvsフォルダを一掃します。

    for /R %%f in (.git,.vs) do rmdir /S /Q "%%f"
    

    最後に

    バッチ処理でfor文コマンドはたまに使用していたが、「R」コマンドについては知らなかった。これでVBSスクリプトを組まなくともバッチでフォルダ内を再帰できるようになったので、今後活用していきたい。