2021年6月17日
robocopyを試してみた!(基本編)
- Category インフラ
はじめに
みなさんこんにちは、横Tです!
今回は、Windows標準機能としてある「robocopy」について、記事にしていきたいと思います!
記事は「基本編」「実践編」の2本立てでお送りいたします!
この記事は1つ目の記事となる「基本編」となりますので、robocopyを使ったことが無いという人にも、できる限りわかりやすく書きたいと思いますので、ぜひ最後まで読んでいってください!
robocopyとは?
そもそも「robocopy」とは何なのか?
一言でいうと「データをコピー」してくれるツールです。すごくシンプルですねー。
ちなみに、マイクロソフトさん公式にも「ファイルのデータをコピーします。」とだけ記載されています。(笑)
これを聞いて「なんだ。ただコピーしてくれるだけか。」と思われる方もいるかもしれませんが、シンプルな説明に反してrobocopyには豊富なオプションがついており、使い方や使う場面によってはとっても有用なツールとなります!
例えば、皆さんがコピーする場面とはどういう場合があるでしょうか?
①今あるフォルダから別のフォルダにコピーしたい。
②ファイル編集前にバックアップとしてオリジナルのファイルを残したい。
③データをすべてコピーしたい。
④定期的にファイルのバックアップを残したい。
おそらく①、②の場面で使用する方が多いかと思いますが、この場合は手動で行ういわゆるコピペでも問題ないでしょう。
それでは③と④の場合はどうでしょうか。
「別にコピペでいいじゃん!」と思われるかもしれませんが、それぞれ”データをすべて”、”定期的に”という条件が付いていますね。
これを実現するのにコピペだけでは実現は難しいと思いませんか?
ファイルがすべてコピーされたか1つ1つ確認するのも、定期的にバックアップを取るのも、どちらも手動で行うにはあまり現実的ではありません。
そこで登場するのがこの「robocopy」なのです!
robocopyの使い方
なんとなくrobocopyがどんなツールで、どんな時に使うのか分かったところで、実際にどのように使うのか見てみましょう。
なお、このrobocopyツールは、Windows Server OSだけでなく、PC OSにも標準でインストールされていますので、Windows OSであれば使うことができます!
まずはコマンドプロンプトを立ち上げて、「robocopy /?」というコマンドを実行します。
※今Windowsパソコンで見ている人は実際に試してみてね!
コマンドプロンプトを立ち上げます。(画像は結果の一部分となります。)
「robocopy /?」というコマンドを実行します。(画像は結果の一部分となります。)
※ 画像の下にある 実行/戻す ボタンを押してみてください!
実際に実行された方は、たくさんの文字が出てびっくりしたかもしれませんが、これで表示できるのはrobocopyの使い方とオプションの一覧となります。
robocopyはコマンドによって実行するツールのため、コマンドプロンプト上での操作が基本となります。
robocopyを使うための基本コマンドは以下の形式です。
※オプションは数が非常に多いので「基本編」での説明は割愛させていただきます。。。
コマンド形式 |
robocopy <コピー元> <コピー先> <ファイル名> |
それではコマンドの使い方を確認できたところで実際に使用していきましょう!
今回は以下のような環境で検証を行っていきます。
端末 | Windows 10 Pro |
コピー元 | C:\Source |
コピー先 | C:\Destnation |
ファイル名 | テスト.txt |
ログ保存先 | C:\robocopylog\ |
ログファイル名 | robocopy_log.txt |
コピー元となるSourceフォルダにテスト用の「テスト.txt」ファイルを作成します。
コマンドプロンプトにて「dir C:\Source」というコマンドで、先ほど作成したテストファイルが確認します。
また、「dir C:\Destnation」でコピー先のフォルダには何もないことも確認できます。
先ほどのコマンド形式に実際の値を当てはめて実行してみます。
実行コマンド |
robocopy C:\Source C:\Destnation テスト.txt |
実行結果として先ほどのテストファイルがコピーされて、結果として「コピー済み」項目のファイルで”1″がカウントされました。ディレクトリは「C:\Source」の分で、コピー対象外のため「スキップ」項目でカウントされていることがわかります。
次は再度「dir」コマンドを実行してファイルがコピーされたか実際に確認してみます。
無事ファイルがコピーされていますね!
いかがでしょうか?これがrobocopyを使用した基本的なコピーとなります。
次はちょっとした条件を加えた場合の挙動を見ていきましょう!
robocopyの挙動
robocopyはコピー元とコピー先のフォルダ状態、使用するオプションによって挙動が変わります。
今回はそれぞれ以下の条件でコピーした場合にどのような動きをするのか見ていきたいと思います!
①コピー先に同じファイルがある場合
②コピー元のファイルを更新した場合
③コピー先のファイルを更新してしまった場合
④フォルダもコピーしたい場合
⑤robocopyのログを別ファイルに出力したい場合
①コピー先に同じファイルがある場合
先ほどの続きで、現在は同じファイルがコピー元、コピー先にある状態です。
この状態で再度同じコマンドを実行するとどうなるのか?
パッと見同じようにコピーが行われているかもしれませんが、結果の部分に注目してみると初回の時は「コピー済み」の項目でカウントされていたファイルが、
今回は「スキップ」項目のところでカウントされています。
これはrobocopyが同一のファイルとしてコピーをスキップ(=コピーしなかった)したということになります。
②コピー元のファイルを更新した場合
それではコピー元が更新されていたとしたらどうなるでしょうか?
編集前のファイル容量は0KBです。
中身を適当に編集して保存します。
容量が変わっていることが確認できます。もちろんコピー先にあるファイルは0KBのままです。
この状態で同じようにコマンドを実行します。
どうでしょう?また結果が変わりましたね!
今度はコピーしたファイルとして「テスト.txt」が表示されており、
「新しい」というステータスで「コピー済み」でカウントされていたりバイト数にも表記があることがわかりますね。
つまり、同じファイル名でも更新されていればコピー対象としてコピーしてくれるということですね。
もちろん、コピー先のファイルを見ても更新されていることが確認できます。
③コピー先のファイルを更新してしまった場合
それではコピー先を更新した場合はどうなるのか見てみましょう。
コピー先のテストファイルを更新して保存します。
※更新日時にも注目してみてね!
この状態で同じようにコマンドを実行します。
「古い」というステータスになっており、「コピー済み」の項目でカウントされていることがわかります。
そして、ファイルの更新日時も更新前の時間に戻っていて、ファイルを開くと更新していたはずの文字が消えていることがわかります。
つまり、コピー先が新しくてもコピー元と差異がある場合は、コピーしてしまうということですね。
なお、これはオプションを指定しない場合の動作となるので、「/XO」オプションを付けることでコピー元が古い場合は、スキップするということもできます。
④フォルダもコピーしたい場合
今まではファイルのみをコピーしてきましたが、フォルダをコピーしたい場合はどうでしょうか。
結論から言うとフォルダもコピーすることができます!
実際にフォルダがコピーできるところを見ていきましょう。
コピー元にテストフォルダを作成します。さらにそのフォルダ内にもテストファイルを作成しておきます。
今まではファイル名を指定していましたが、代わりに「/E」オプションを付けてコマンドを実行します。
コピー対象として「新しいディレクトリ」とその中に作成した「てすと.txt」が表示されており、「コピー済み」項目では新しく作成したフォルダとファイルがそれぞれカウントされ、「スキップ」項目では先ほどまでコピーされていた「テスト.txt」分がカウントされていることがわかります。
実際にコピー先を見てもしっかりコピーされていますね!
⑤robocopyのログを別ファイルに出力したい場合
今までは、コマンドを実行したコマンドプロンプト上にそのまま実行結果が出力されていましたが、コマンドプロンプトを閉じてしまうと結果は消えてしまいます。
そこで、「/LOG:<ログファイル名>」のオプションを指定することで、別ファイルにログを残すことができます。
ログファイルの出力先用に「robocopylog」フォルダを作成します。中には何もファイルはありません。
先ほどのコマンドに「/LOG:」オプションを付けて実行してみます。
すると、今まで表示されていたログが表示されずに、代わりにログファイル先が表示されていることがわかります。
ログの出力先として指定した「C:\robocopylog」に「robocopy_log.txt」ができていますので、ファイルの中身を見てみましょう。
先ほどまでコマンドプロンプト上に表示されていた結果が、書き込まれていることがわかります。
このオプションを指定しておけば、ログをテキストで残すこともできるので後から見返すこともできます。
また、今回は少ない数のファイル、フォルダだったのでコマンドプロンプト上でも問題はありませんでしたが、
ファイル数が多いとその分だけログが出力されることになるので、コマンドプロンプトのバッファを超えるログになると最初のほうのログから消えていくことになりますのでご注意ください。
なお、「/LOG+:」という似たようなオプションもありますが、こちらは書き込む際に”追記”処理となります。
「/LOG:」は”上書き”処理となるので、状況に応じてオプションを使い分けてみてください!
※コマンドプロンプトのバッファは設定次第ですが、最大でも9999行です。
まとめ
いかがだったでしょうか?
今回は基本編なので細かいオプションは付けないで、基本的な使い方を中心に書かせていただきました。ここまで確認してきた内容をおさらいしてみましょう。
・robocopyはデータをコピーしてくれるツール
・ファイルもフォルダもコピーできる
・実行時の条件(状態)によって挙動が異なる
内容 | 結果 |
①コピー先に同じファイルがある場合 | 同じファイルはスキップされる |
②コピー元のファイルを更新した場合 | コピー元と同じ内容にコピー(更新)される |
③コピー先のファイルを更新してしまった場合 | コピー元と同じ内容にコピー(更新)される ※「/XO」オプションでコピー(更新)しなくなる |
④フォルダもコピーしたい場合 | 「/E」オプションを付けることでコピーできる |
⑤robocopyのログを別ファイルに出力したい場合 | 「/LOG:」または「/LOG+」オプションで出力できる |
「ちょっと待って。すべてコピーしたい場合と定期的にバックアップしたい場合の例がないじゃん!」と
思われている方もいらっしゃるかと思いますが、どちらも説明が長くなってしまうので
そちらは次回の「実践編」で記事にさせていただきます!
それでは最後まで読んでいただきありがとうございました!
次の「実践編」でお会いしましょう!