Windowsでフォルダをバックアップするとき、エクスプローラーで対象ディレクトリをコピー&ペーストしていたのですが、
コマンドプロンプトでrobocopyコマンドを実行したほうがかなり便利ということを知りました。
robocopyとは
ファイルをコピーするコマンド。Linuxではrsyncと似ており、差分バックアップ等の設定も可能です。
Windows Server2003やWindows XPではWindows Server 2003 Resource Kit Toolsのインストールが必要でしたが、Windows Server2005またはWindows Vista以降では標準で使える機能です。
- 差分コピーが可能
- 指定ディレクトリからの○番目の子ディレクトリまでコピーと指定が可能
- 細かい設定が可能(アーカイブ指定、名前指定、サイズ指定等)
- ファイルパス制限(256文字)を超えたファイルアクセスが可能
色々設定が可能ですが、差分コピーと憎きファイルパス制限の影響を受けないのが大きなメリットだと思います。
エクスプローラ上コピー&ペーストだと重複ファイルが存在した場合の確認が出てくるまで重複ファイルが存在するのかわからないうえにどっちが新しいのか毎回選択しないといけませんが、robocopyだとオプションで予め指定が可能なため、簡単にコピーができます。
また、Vista以降のOSなら標準で搭載されている点もうれしいところです。
使い方
robocopy 【オプション】 【コピー元】 【コピー先】でできます。
オプション指定なしの場合、. /DCOPY:DA /COPY:DAT /R:1000000 /W:30が自動でつくようです。
オプションは用途によって異なると思いますが、私の場合「robocopy /E /ZB /R:3 /LOG:【ログファイル場所】 /XJD /XJF 【コピー元】 【コピー先】」をよく使います。(オプション説明はこちら)
例)Fドライブにあるtestフォルダからtest2フォルダにコピーした場合(適当に3ファイル保管した場合)
F:\>robocopy test test2
-------------------------------------------------------------------------------
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
開始: 2021年9月21日 1:08:25
コピー元 : F:\test\
コピー先 : F:\test2\
ファイル: *.*
オプション: *.* /DCOPY:DA /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
3 F:\test\
100% 新しいファイル 6566 テストExcel.xlsx
100% 新しいファイル 33698 テストパワポ.pptx
100% 新しいファイル 10.0 m テストファイル.txt
------------------------------------------------------------------------------
合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 1 0 1 0 0 0
ファイル: 3 3 0 0 0 0
バイト: 10.13 m 10.13 m 0 0 0 0
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
速度: 624979764 バイト/秒
速度: 35761.628 MB/分
終了: 2021年9月21日 1:08:25
オプション
分類 | オプション |
説明
|
---|---|---|
子ディレクトリ | /S | サブディレクトリもコピー対象にする。空ディレクトリはコピーしない。 |
/E | サブディレクトリもコピー対象にする。空ディレクトリもコピーしない。 | |
モード | /Z | 再起動モードでファイルをコピーする。(規定値) |
/B | バックアップモードでファイルをコピーする。 | |
/ZB | 再起動モードで行い、アクセス拒否された場合はバックアップモードで実行する。 | |
リトライ | /R:【回数】 | コピーが失敗したときの再試行回数の設定(規定値:100万回)。 |
/W:【秒数】 | コピーが失敗したときの再試行を行うまでのインターバル時間(規定値:30秒)。 | |
/REG | 次回時に設定した/R及び/Wを規定値にするためにレジストリに保存する。 | |
接合ポイント除外 | /XJD | ジャンクションフォルダ(Linuxではシンボリックリンクフォルダ)を除外する。 これを指定しないとジャンクションフォルダのデータもコピー対象になる。※1 |
/XJF | ジャンクションファイル(Linuxではシンボリックリンクファイル)を除外する。 これを指定しないとジャンクションファイルのデータもコピー対象になる。※1 |
|
/XJ | /XJD+/XJFと同様。 | |
ログ | /LOG:【ファイルパス】 | ファイルパスへログを書き込む。(新規書込み) |
/LOG+:【ファイルパス】 | ファイルパスへログを書き込む。(追記書込み) | |
削除系 | /PURGE | コピー元に存在しないファイルを削除する。 ※/Eと併用した場合、コピー先の既存ディレクトリに対しセキュリティ設定の上書きを行わない。 |
/MIR | /E+/MURGEとほぼ同様の設定になる。 ※コピー先の既存ディレクトリに対しセキュリティ設定の上書きを行う。 |
|
/MOV | ファイルコピー・移動実行後にコピー元からファイルを削除する。 ※ディレクトリは削除されない。 ※既にコピー先にファイルが存在する場合、ファイルは削除されない。 |
|
/MOVE | /MOV+ディレクトリも削除対象になる。 | |
属性 | /COPY:【属性】 |
コピーする属性情報を指定します。属性は以下の通りデフォルトは/COPY:ADT(属性、データ、登録更新日付) |
他にもいろんなオプションがあるようですので他設定も知りたい方はこちらを参考してください。
※1 Windowsでもシンボリック・リンクはあるのですが、厳密には異なるみたいです。Windowsで利用できるリンクの種類はこちらを参照
ネットワークドライブへバックアップする際の注意
コピー先がネットワークドライブの場合、「アクセスが拒否されました。」と表示されコピーできない場合があります。
NASやLinux環境の共有ファイル等へコピーする際、属性情報のコピーができないのが原因のため、「/COPY:DT」と指定すればコピーできると思います。
システムドライブをバックアップする際の注意
/XJ(または/XJD+/XJF)オプションを設定せずにコピー元をシステムドライブ(C:)を設定すると C:Documents and Settings【ユーザ名】AppDataLocalApplication DataApplication DataApplication Data…と無限ループが発生する場合があります。
ジャンクションファイル・フォルダ(Linuxではシンボリックリンク)が設定されているディレクトリをコピーする際は/XJオプション設定追加が無難です。(コピー元ディレクトリ内に遷移するジャンクションファイル・フォルダが存在すると無限ループが発生する恐れがあるため)
ドライブ全体をコピーする際の注意
コピー元をドライブ全体、コピー先をフォルダとしてrobocopyを実行した場合、システムの隠しフォルダとして設定され、通常方法では見えなくなる場合があります。
データは使用されているが、フォルダが見当たらない…
直接ディレクトリパスを指定すれば見ることもできるのですが、めんどくさい。
フォルダを見えるようにするには以下のどちらかを設定する必要があります。
フォルダオプションで設定する
コントロールパネル⇒フォルダオプション(Win10の場合:エクスプローラーのオプション)⇒表示タブを選択⇒ファイルとフォルダーの表示で
・「隠しファイル、隠しフォルダー、及び隠しドライブを表示する。」を設定
・「保護されたオペレーションシステムファイルを表示しない(推奨)」のチェックを外す
ことでコピー先のフォルダが見えるようになります。
隠しファイルを表示するだけじゃ表示されないので注意すること。
「保護されたオペレーションシステムファイルを表示しない」のチェックを外すと、削除したらシステムが不安定になる恐れのあるファイル・フォルダも表示されるので設定後は注意すること。
コマンドプロンプトで設定する
コマンドプロンプトで「ATTRIB -H -S 【対象パス】」で隠し属性を削除することで通常にフォルダが見えるようになります。
フォルダオプションで設定するリスクがなくなる分こちらのほうがよいです。
robocopyで設定する
robocopyで隠しフォルダ設定を回避することはできないようです。
robocopy実行後にattribコマンド実行が定石のようです。
参考サイト
Robocopy
robocopy後のコピー先フォルダが隠しフォルダになってしまう
Windows 7 infinite loop while using Robocopy