こんなことを知りたい人へ向けて書いています
- 「copy」コマンドでは実現できなかった、もう少し高度なコピーをしたい方
- 「xcopy」コマンドでどんなことができるのか知りたい方
- 「xcopy」コマンドで行えるはずの、目的の操作を探したい方
目次
- 「xcopy」コマンドの使い方
- 日付が新しいファイルのみコピーする
- 指定の日付以降に変更されたファイルだけをコピーする
- サブフォルダごとコピーする
- コピーしないファイル・フォルダを指定する
- コピーしているファイル名を表示する・しない
- 指定したコピー先をフォルダとしてコピーする(自動で)
- コピーは行わずコピー対象となるファイル名を表示するだけ
- 確認メッセージを表示する・しない
- ファイルはコピーせずにフォルダ構成だけを構築する
- コピー先に存在するファイルのみをコピーする
- コピー開始前に一時停止し、キー入力でコピーを開始する
その他の関連しそうな記事
「xcopy」コマンドの使い方
基本的には「copy」コマンドと同様の使い方ですが、オプションを付けることによってより高度なコピーを行うことができます。大きな特徴としては、フォルダごとコピーできるということです。これによって、バックアップ用のコマンドとしてよく使用されます。以下は基本的な「xcopy」コマンドの使い方です。
1 |
xcopy [オプション] [コピー元ファイル・フォルダ] [コピー先ファイル・フォルダ] |
「xcopy」コマンドの[オプション]には非常に様々なものが用意されています。この記事でも使う頻度が高そうなオプションについては紹介していきますが、全ては扱いません。全ての使用できるオプションとその機能を確認したい方は、「xcopyのオプション簡易解説へ」を参照して下さい。
「copy」コマンドの高度化したコマンドとして、もう一つ「replace」コマンドがありますが、「xcopy」コマンドの方がより様々なオプションを使用でき、使い勝手もいいため、こちらが一般的によく使用されているようです。
日付が新しいファイルのみコピーする
バックアップコマンドとして「xcopy」コマンドを使うとき、必ず使用されるオプションとして、「/d」オプションがあります。これは、コピー先に同じ名前のファイルがあったときにコピー元のファイルと更新日時を比較して、新しければコピーするというオプションです。つまり、前回コピーしたファイルが変更されたときだけをコピーするというものです。
- 前回から変更があるファイル → コピー対象
- 前回から変更のないファイル → コピー対象外
更新日時が同じ場合には、そのファイルは前回から変更されていないということなので、コピーする意味がないと判断されコピーされません。これによってバックアップ時にすべてのファイルを毎回コピーしないでよくなるため、コピー時間が大幅に短縮されます。
以下の画像は、「file.txt」ファイルを「backup」という空フォルダに「/d」オプションを指定して二回続けてコピーしたときのコマンドプロンプト画面の表示です。
一度目は通常通りコピーされていますが、二度目はコピーされていません。これは、「backup」フォルダには一度目にコピーしたファイルが既にあり、そのファイルも更新されていなかったので二度目のコピーではコピーする意味がないと判断されたためです。
指定の日付以降に変更されたファイルだけをコピーする
前節で登場した「/d」オプションに日付を追記して、指定の日付以降に変更されたファイルだけをコピーすることもできます。yyYY年MM月DD日以降に更新されたファイルをコピー対象としたい場合、
1 |
xcopy /d:MM-DD-YY [コピー元ファイル] [コピー先フォルダ] |
のように書きます。「/d:」の後に続けて日付を指定しますが、その順番に注意してください。「月」、「日」、「年の下2桁」の順です。
例として、以下の二つの更新日時が異なるファイルがあったとします。
- file_20161107.txt → 2016年11月7日に最終更新されたファイル
- file_20161121.txt → 2016年11月21日に最終更新されたファイル
2016年11月20日以降に更新されたファイルをコピー対象として「xcopy」コマンドを実行してみましょう。以下のようなコマンドになります。
1 |
xcopy /d:11-20-16 file_*.txt backup |
「file_*.txt」はワイルドカード「*」を使って上記した二つのファイルを対象としていますが、11月20日以降に更新された「file_20161121.txt」だけがコピーされます。
サブフォルダごとコピーする
コピー対象としているフォルダの中にさらにフォルダがある(これを「サブフォルダ」と呼ぶ)とします。通常、「xcopy」コマンドではサブフォルダまではコピーされません。
【ファイル構成】
対象フォルダ ← ここを対象にコピー
∟サブフォルダ ← ここはコピーされない
フォルダ内のサブフォルダまで含めてコピーしたいときは、「/s」オプションを用います。
例えば、「folder」フォルダの中にサブフォルダ「subfolder」が存在していて、「subfolder」フォルダごと「copy_folder」フォルダにコピーしたいときは、
1 |
xcopy /s folder copy_folder |
とします。
——————————
またはディレクトリ名ですか
(F= ファイル、 D= ディレクトリ)?
——————————
と聞かれるので、「D」と入力するとフォルダ・サブフォルダ内のファイルも含めてコピーされます。
ただし「/s」オプションでは、サブフォルダの中身が空の場合にはコピーされません。サブフォルダの中身が空でもフォルダをコピーしたい場合は、「/e」オプションを指定します。以下に「/s」オプションを使った場合と、次に「/e」オプションを使った場合のコマンドプロンプト実行画面を示します。
「xcopy」コマンドを使って、「folder」フォルダを「copy_folder」フォルダにコピーしようとしています。
一度目の「/s」オプションを使ったコマンドでは、「copy_folder」フォルダは作られていませんでした。次に「/e」オプションを使ったコマンドで、「copy_folder」フォルダが作られたのが分かります。
コピーしないファイルを指定する
「/exclude」オプションを使用して、コピーしたくないファイルをコピー対象から除外することができます。例として、「folder」フォルダの中に「file1.txt」、「file2.txt」、「file3.txt」があったとします。これらのファイルは「folder」フォルダへ入っています。
【ファイル構成】
folder(フォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
この状況下で、
1 |
xcopy folder copyfolder |
とすれば、もちろんフォルダ内の全てのファイルがコピーされます。
ここで、「file3.txt」をコピーしたくない場合を考えましょう。まず、コピーしたくないファイルを記述した除外リストファイルを作成します。ここでは、「exclude_filelist.txt」ファイルに以下のように書き込みました。
このファイルを「folder」フォルダが存在するフォルダに一緒に入れておきます。
次に「xcopy」コマンドを実行するのですが、そのとき「/exclude」オプションを使用し、続けて除外リストファイル(exclude_filelist.txt)を指定します。以下のような感じです。
1 |
xcopy /exclude:exclude_filelist.txt folder copyfolder |
「/exclude」オプションに「:」を挟んで除外リストファイルを指定しています。
以下、実行結果です。
「file3.txt」ファイルがコピーされていないことが分かります。この除外リストファイルにコピーしたくないファイルのリストを書いておけば、そのファイルのコピーを飛ばしてくれます。指定するファイルは複数でも構いません。
コピーしているファイル名を表示する・しない
ワイルドカード「*」で複数のファイルをコピー対象にしているときや、コピーに時間がかかるときには今何をコピーしているのか詳しく分かると便利です。オプションを付けない通常のコピーでも、コピー対象のファイル名は表示されます(下図)。
コマンド実行直後からコピーしているファイル名と、最後にいくつのファイルをコピーしたかという表示がでます。これがデフォルトの状態です。
「/f」オプションを付けると、どのコピー元フォルダからどのコピー先フォルダへコピーしたかが詳細に分かるようになります(下図)。
「コピー元ファイルのフルパス名 -> コピー先ファイルのフルパス名」と表示されています。ファイル名がフルパス付きで表示されるため、若干見づらくなる場合もあります。
逆に、コピーしているファイル名をまったく表示させたくないときは「/q」オプションを指定すると、まったくコピー情報の表示が最小限となります(下図)。
このように、コピーしたファイルの数だけが最後に表示されます。
指定したコピー先をフォルダとしてコピーする(自動で)
例えば、「folder」フォルダを「copyfolder」フォルダとしてオプション無しでコピーしようとした場合、「copyfolder」フォルダが存在しないときには、「copyfolder」がファイルなのかフォルダなのかを選択する必要があります(下図)。
※バッチファイルでは「フォルダ」を「ディレクトリ」とも呼びます。
この場合、「copyfolder」はフォルダなので「D」を手動で入力すればよいのですが、少し面倒です。特にバッチファイルを使って完全に自動化処理をさせたい場合などは人間の操作が全く不要なプログラムを作りたいです。
そこで、「/i」オプションを使うと、この確認メッセージを省略することができます。勝手にディレクトリ(D)としてコピーを行ってくれるのです。
以下、「/i」オプションを付けた実行結果です。
確認メッセージは表示されずに、「D」を入力する手間が省けました。
コピーは行わずコピー対象となるファイル名を表示するだけ
「/l」オプションを指定すると、コピー対象となるファイルだけを表示して実際にコピーは行いません。
例として、「folder」フォルダ、「folder\subfolder_1」フォルダ、「folder\subfolder_2」フォルダの下に「file1.txt」ファイル、「file2.txt」ファイル、「file3.txt」ファイルがそれぞれ入っている場合を考えます。以下のようなフォルダ構成です。
【フォルダ構成】
folder(フォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
∟subfolder_1(サブフォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
∟subfolder_2(サブフォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
「/l」オプションを使用してどのファイルがコピー対象となるか以下のコマンドで確認を行います。
1 |
xcopy /l /e /i folder copyfolder |
ここでは、前節で紹介した「/e」、「/i」オプションを指定しています。
- /e → フォルダ内が空でもコピーする
- /i → コピー先の指定をフォルダ(ディレクトリ)名とみなしてコピーする
でした。
実行結果は以下のようになります。
この実行ではコピー対象ファイルの確認だけなので、「copyfolder」フォルダは作成されません。したがって、本当はコピー先フォルダを指定する必要もなく、以下のコマンドでも同様の結果が得ることができます。
1 |
xcopy /l /e /i folder |
確認メッセージを表示する・しない
コピー時にコピー先に指定したファイルが既に存在し、ファイルを上書きするときには、確認メッセージが表示されます。
ファイル毎に上書きするかどうかを尋ねられるので、上書きするときは「Y」、しないときは「N」を入力してコピーを進めます。また、「A」を入力すると、それ以降のファイルが全て上書きされます。以下は、その実行例です。「Y」や「N」、および「A」は自分の手で入力しています。
このように一つ一つ確認しながらコピーを行う必要がなく、確認メッセージ表示させずに、全てを上書きしたい場合もあります。
確認メッセージを表示させたくない場合には、「/y」オプションを指定すれば全てを上書きする設定で実行されます。つまり、すべて「Y」、もしくは「A」を選択した結果と同様です。
反対に、コピー先にファイルが無く、上書きでないコピーの場合でも、一つ一つのファイルを確認しながらコピーするかどうか決めたいときは、「/p」オプションを指定します。このようにすれば、毎回確認メッセージが表示されますので、「Y」および「N」を入力してコピーを進めることができます。
ファイルはコピーせずにフォルダ構成だけを構築する
フォルダ内のファイルはコピーせずにフォルダ構成だけを構築したい場合は、「/t」オプションを用います。
1 |
xcopy /t folder copyfolder |
これで、「folder」フォルダ内のサブフォルダを含めてフォルダ構成だけが作成されますが、各フォルダにはファイルが存在しません。
例えば、以下のようなフォルダ構成があったとします。
【フォルダ構成】
folder(フォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
∟subfolder_1(サブフォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
∟subfolder_2(サブフォルダ)
∟file1.txt
∟file2.txt
∟file3.txt
このように、フォルダの中にはファイルが存在していますが、「folder」フォルダを「/t」オプションでコピーした場合、
1 |
xcopy /t folder copyfolder |
作成された「copyfolder」フォルダは、以下のようになっています。
【フォルダ構成】
copyfolder(フォルダ)
∟subfolder_1(サブフォルダ)
∟subfolder_2(サブフォルダ)
ファイルは全て消え、フォルダ構成だけが残るのです。
コピー先に存在するファイルのみをコピーする
コピー先に存在するファイルのみをコピーするには、「/u」オプションを使用します。
例えば、コピー元フォルダとして「folder」フォルダがあり、中には「file1.txt」ファイル、「file2.txt」ファイル、「file3.txt」ファイルがあったとします。そして、コピー先フォルダは既に「copyfolder」フォルダが存在し、中には「file1.txt」のみがある場合を考えます。以下のような状況です。
【コピー元】
folder
∟file1.txt
∟file2.txt
∟file3.txt
【コピー先】
copyfolder
∟file1.txt
このとき、「/u」オプションを使用した「xcopy」コマンドを実行すると、
1 |
xcopy /u /y folder copyfolder |
「file1.txt」ファイルのみがコピー対象となります。※「/y」はコピー先に既存ファイルがある場合、上書きする前に確認メッセージを表示しないオプションです。以下に実行結果を示します。
このように、コピー元とコピー先のフォルダに存在する共通のファイル「file1.txt」だけがコピーされました。
コピー開始前に一時停止し、キー入力でコピーを開始する
バッチファイルに「xcopy」コマンドを使用するときによく指定するオプションとして、「/w」があります。「/w」を指定すると、コピー開始前に一時停止しユーザーからのコピー開始許可を待ちます。以下の画像は実行例です。
何かのキーを押すとコピーが始まります。大規模なコピーを行う前の最終確認に利用できます。