【コマンド/bat】ファイル検索の結果ファイルをコピーする2つの方法(Windows)

はじめに

今回は、Windowsのコマンド/batファイルの話です。
内容はほぼタイトル通りなんですが、「再帰的なあいまいなファイル検索をして、その結果を指定ファイルにコピーしたい!」という内容を実現するための記事です。

私は今まで、こういう時に簡単なツールを作ったりしていたのですが…
どうやらこの程度ならbatファイルだけ、というか、コマンドプロンプトに1行書くだけで処理できるらしいです。
結構batファイルでできる範囲が広いようなので、これからbatファイルやコマンドプロンプトについて学んだことも記事にしていこうかなと思います。

1つ目の方法. forfilesコマンドを使用する(こっちが主流っぽい)

1つ目の方法は、forfilesというコマンドを使用した方法です。
このコマンドは、ファイル抽出に特化したコマンドらしく、ファイル名に限らず、最終更新日による抽出なども同時にかけらて、便利です。
したいことがファイルに対する操作であれば、forfilesを使用するのが妥当なようです。

 

使い方としては、

forfiles /s /m *.js /c "cmd /c copy @path "C:\Users\MYUSER\Desktop\mytest\js"

のような感じです。
上記のコマンドの前半(forfiles /s /m *.js /c )は、
/s オプションで再帰的にファイル検索
/m オプションで検索するファイルパターンを指定(今回は.js拡張子を持つ全てのファイルを探したい)
/c オプションで後続のコマンドを実行
を意味します。

後半(“cmd /c copy @path “C:\Users\MYUSER\Desktop\mytest\js”)は、
cmd でコマンド実行
/c オプションで後続のコマンドを実行
copy でコピーを指示, 第1引数のパスを第2引数のパスにコピーする、という意味です
@pathは、forfilesコマンドを使用した時に、バインドされる変数で、@pathならフルパスを意味します。例えば、@fileであればファイル名のみを意味する、等いくつか用意されています。

上記コマンドは、.batにして実行するか、コマンドプロンプトを立ち上げてコピーペすればOKです。

2. for in 構文を使用する

こちらは、batファイルでループ処理を行うことができるfor – in 文を使用したものです。
タイトルの内容のみを実現するのであれば、1. で充分なのですが…
私としては目からウロコの方法だったので備忘のために載せておきます。

下記のような使い方です。

for /f %%A in ('dir /b /s *.ts') do copy "%%A" .\ts\

for in文の基本構文は下記の通りで、

for %%(アルファベット1文字) in (処理対象) do (コマンド)

これに、
/f オプションを指定して(処理対象)をファイルとして扱う宣言をし、
(処理対象)に対象ファイルを抽出するためのコマンドを記述、
do以降には、copyコマンドを発行して、(処理対象)文copyを行います。

(処理対象)にあたる

dir /b /s *.ts

は、
/b でファイル名のみ取得
/s で再帰的にファイル探索
末尾の文字列で検索対象ファイルを絞り込んでいます。

はい。ほぼ、自分のための備忘記事でした。

今回は以上です!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です