robocopy で ファイルをコピーするには

投稿者: | 2019年4月17日

robocopy でコピー

robocpoy はフォルダをコピーする際には便利です。


robocopy D:\data E:\save /MIR /DCOPY:DAT /COPY:DAT /W:1 /R:1 /NP

結論、ファイルをコピーする場合

では、ファイルをコピーするときにはどうするのか、です。
コピー元(フォルダ) コピー先(フォルダ)のあとに、ワイルドカード可でファイル名を書いてやります。


ROBOCOPY コピー元 コピー先 [ファイル [ファイル]…] [オプション]

例えば、 a.txt だけをコピーしたい場合。(ついでに他のオプションあり)


robocopy D:\data E:\save a.txt /MIR /DCOPY:DAT /COPY:DAT /W:1 /R:1 /NP

.txtの拡張子をコピーしたい場合。(ついでに他のオプションあり)


robocopy D:\data E:\save *.txt /MIR /DCOPY:DAT /COPY:DAT /W:1 /R:1 /NP

【追記】
robocopyで『ファイルのみ』コピーするには という記事も書きました。『ファイルを』コピーしたい場合はこの記事、『ファイルのみ』コピーしたい場合は、リンクを見てください。
【追記ここまで】

ヘルプでは以下の通り


D:\>robocopy /?

——————————————————————————-
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
——————————————————————————-

開始: 2019年4月16日 22:24:37
使用法:: ROBOCOPY コピー元 コピー先 [ファイル [ファイル]…]
[オプション]

コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー
\共有\パス)。
コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー
\共有\パス)。
ファイル :: コピーするファイル (名前/ワイルドカード: 既定値は「*.*」
です)

やってみます。

D:\data は、以下のようなものを用意。


D:\data>dir
ドライブ D のボリューム ラベルがありません。
ボリューム シリアル番号は E4A5-777A です

D:\data のディレクトリ

2019/04/16 22:19

.
2019/04/16 22:19 ..
2019/04/16 22:11 6 a.txt
2019/04/16 22:11 6 b
2019/04/16 22:11 6 c.c.c
2019/04/16 22:12 6 d.txt
2019/04/16 22:19 0 dir
5 個のファイル 24 バイト
2 個のディレクトリ 244,045,606,912 バイトの空き領域

まずは、全コピー


D:\>robocopy d:\data e:\save

——————————————————————————-
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
——————————————————————————-

開始: 2019年4月16日 22:23:39
コピー元 : d:\data\
コピー先 : e:\save\

ファイル: *.*

オプション: *.* /DCOPY:DA /COPY:DAT /R:1000000 /W:30

——————————————————————————

5 d:\data\
100% 新しいファイル 6 a.txt
100% 新しいファイル 6 b
100% 新しいファイル 6 c.c.c
100% 新しいファイル 6 d.txt
100% 新しいファイル 0 dir

——————————————————————————

合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 0 1 0 0 0
ファイル: 5 5 0 0 0 0
バイト: 24 24 0 0 0 0
時刻: 0:00:00 0:00:00 0:00:00 0:00:00

速度: 58 バイト/秒
速度: 0.003 MB/分
終了: 2019年4月16日 22:23:39

テキストファイルだけコピー


D:\>robocopy d:data e:\save *.txt

——————————————————————————-
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
——————————————————————————-

開始: 2019年4月16日 22:29:51
コピー元 : D:\data\
コピー先 : e:\save\

ファイル: *.txt

オプション: /DCOPY:DA /COPY:DAT /R:1000000 /W:30

——————————————————————————

2 D:\data\
100% 新しいファイル 6 a.txt
100% 新しいファイル 6 d.txt

——————————————————————————

合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 0 1 0 0 0
ファイル: 2 2 0 0 0 0
バイト: 12 12 0 0 0 0
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: 2019年4月16日 22:29:51

少々いちゃもんつけます

ヘルプの以下の記述はおかしいです。

ファイル :: コピーするファイル (名前/ワイルドカード: 既定値は「*.*」です)

*.* が既定値だと、b とか x とか拡張子をつけないファイルや、.txt のような拡張子だけのファイルは既定ではコピーされないことになってしまいます。「*」は0文字以上の文字列(この表現で0文字だったら文字列じゃないかも…という突っ込みもあるのかもしれませんが)であり、「.」は、そのもの1文字の文字だからです。

ちなみに、b という拡張子を持たない1文字のファイルと、 b. として拡張子を入れないファイルは等価のようで、 echo aaa > b とやったあと echo bbb > b. とすると上書きしてしまいます。(2つファイルができることはありません。)

robocopyのコマンドで、ファイル名のところで何も指定しない場合は b だけの拡張子を持たないファイルもコピーされます。本当に厳密にいうなら、 *.* と * の両方が既定値、ということでしょう。

なお、拡張子を持たない1文字のファイルをコピーする場合は、以下のように指定します。


robocopy D:\data E:\save ?

このときに、 b はコピーされますが、 .a という拡張子のみ1文字のファイルはコピーされません。


robocopy D:\data E:\save ?.*

とした場合は、 .a a.txt b c.c.c d.txt とコピーをされましたが、拡張子なしの dir という3文字のファイル(わざと作った)はコピーされませんでした。これだと c.c.c は .が2つありますが、最初の c. のあとの c.c が拡張子と判断されているのでしょうか? それとも . に関係なく 1文字のあとに.で、続けて * として c.c は文字列と解釈でしょうか。

試したみたところ、ファイル名で * を明示的に指定するのと、*.* を明示的に指定するのと、何も指定しない(既定で*.*が取られる、とヘルプにあるパターン)は、同じ動きでした。

Windowsの拡張子の解釈が非常に難しいというのか、よくわからないし、これはWindowsの世界の話。
Microsoftは、『書いていることを杓子定規に言えばおかしいけれど、普通に期待するものとして、そういうふうに動作してほしい』というものを想定して作っている、ということのようです。

気軽に「バグだ」と言い出す人には嫌悪感、不信感を持ちます。
作る側に回ったことがある人間だったら、気軽に「バグだ」と言われるのは不快きわまりないことじゃないかと想像はつくはず。これもバグだとか言いたいのではなくて、なにか気になることがあれば調べてみたくなるSEの特性みたいなものです。

robocopy で ファイルをコピーするには」への1件のフィードバック

  1. ピンバック: robocopyで『ファイルのみ』コピーするには – 湘南藤沢.ネット

コメントは停止中です。