Robocopy はファイル システム リンク (シンボリック リンク、ハード リンク、ジャンクション) をどのように処理しますか?

Robocopy はファイル システム リンク (シンボリック リンク、ハード リンク、ジャンクション) をどのように処理しますか?

Robocopy バックアップを削除しても安全ですか? リンク/ジャンクションが含まれていたために、バックアップ外のファイルを誤って削除した人がいると読みました。これを防ぐことはできますか?

答え1

Robocopy ドキュメントファイルシステムリンクに関する Robocopy の動作を制御するオプションを一覧表示します。

/sl シンボリック リンクをたどらず、代わりにリンクのコピーを作成します。
/xj 通常は既定で含まれるジャンクション ポイントを除外します。
/xjd ディレクトリのジャンクション ポイントを除外します。
/xjf ファイルのジャンクション ポイントを除外します。

私は、これらのオプションの有無でRobocopyがどのように動作するかを調べるためのバッチスクリプトを作成しました。mlinkを使用するとmlink、以下を作成できます。

  • ファイルとディレクトリへのシンボリック リンク。
  • ファイルへのハード リンク。ディレクトリへのハード リンクを作成しようとすると、エラーが発生します。
  • ジャンクションは、ディレクトリへのリンクです。ファイルへのジャンクションを作成しようとすると成功しますが、ジャンクションは壊れます。

シンボリック リンクは、ターゲット パラメータを渡す方法に応じて、相対または絶対になります。ハード リンクとジャンクションは、相対ターゲットを渡した場合でも、常に絶対になります。

@echo off
set home=C:\my-directory
cd %home%
mkdir robocopy-source
cd robocopy-source
mkdir a
mkdir b
copy NUL b\foo.txt
cd a
mklink /j junction-dir-absolute %home%\robocopy-source\b\
mklink /d symlink-dir-absolute %home%\robocopy-source\b\
mklink /d symlink-dir-relative ..\b\
mklink /h hardlink-file-absolute %home%\robocopy-source\b\foo.txt
mklink symlink-file-absolute %home%\robocopy-source\b\foo.txt
mklink symlink-file-relative ..\b\foo.txt
cd %home%
robocopy robocopy-source robocopy-target /mir /dcopy:dat
robocopy robocopy-source robocopy-target-sl /mir /dcopy:dat /sl
robocopy robocopy-source robocopy-target-xj /mir /dcopy:dat /xj
robocopy robocopy-source robocopy-target-xjd /mir /dcopy:dat /xjd
robocopy robocopy-source robocopy-target-xjf /mir /dcopy:dat /xjf

使用方法リンクシェル拡張何が起こったのか見てみましょう:

パス 情報
robocopy-source\a\junction-dir-absolute %home%\robocopy-source\b\ へのリンク
robocopy-source\a\symlink-dir-absolute %home%\robocopy-source\b\ へのリンク
robocopy-source\a\symlink-dir-relative リンク先 ..\b\
robocopy-source\a\hardlink-file-absolute %home%\robocopy-source\b\foo.txt (およびそれ自身) へのリンク
robocopy-source\a\symlink-file-absolute C:\Users\Marco\Desktop\Linktest\robocopy-source\b\foo.txt へのリンク
robocopy-source\a\symlink-file-relative ..\b\foo.txt へのリンク
robocopy-target\a\junction-dir-absolute %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target\a\symlink-dir-absolute %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target\a\symlink-dir-relative %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target\a\hardlink-file-absolute 空のファイル
robocopy-target\a\symlink-file-absolute 空のファイル
robocopy-target\a\symlink-file-relative 空のファイル
robocopy-target-sl\a\junction-dir-absolute %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target-sl\a\symlink-dir-absolute %home%\robocopy-source\b\ へのリンク
robocopy-target-sl\a\symlink-dir-relative リンク先 ..\b\
robocopy-target-sl\a\hardlink-file-absolute 空のファイル
robocopy-target-sl\a\symlink-file-absolute %home%\robocopy-source\b\foo.txt へのリンク
robocopy-target-sl\a\symlink-file-relative ..\b\foo.txt へのリンク
robocopy-target-xj\a\junction-dir-absolute 存在しない
robocopy-target-xj\a\symlink-dir-absolute 存在しない
robocopy-target-xj\a\symlink-dir-relative 存在しない
robocopy-target-xj\a\hardlink-file-absolute 空のファイル
robocopy-target-xj\a\symlink-file-absolute 存在しない
robocopy-target-xj\a\symlink-file-relative 存在しない
robocopy-target-xjd\a\junction-dir-absolute 存在しない
robocopy-target-xjd\a\symlink-dir-absolute 存在しない
robocopy-target-xjd\a\symlink-dir-relative 存在しない
robocopy-target-xjd\a\hardlink-file-absolute 空のファイル
robocopy-target-xjd\a\symlink-file-absolute 空のファイル
robocopy-target-xjd\a\symlink-file-relative 空のファイル
robocopy-target-xjf\a\junction-dir-absolute %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target-xjf\a\symlink-dir-absolute %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target-xjf\a\symlink-dir-relative %home%\robocopy-source\b\ のコピーされたコンテンツを含むディレクトリ
robocopy-target-xjf\a\hardlink-file-absolute 空のファイル
robocopy-target-xjf\a\symlink-file-absolute 存在しない
robocopy-target-xjf\a\symlink-file-relative 存在しない

/slこのオプションを使用していない限り、Robocopyで作成されたバックアップを削除しても安全だと結論付けます。/slただし、このオプションを使用した場合は、絶対シンボリックリンクによって問題が発生する可能性があります。例:delコマンドを使用する場合

さらなる観察:

  • ハードリンクでは常に空のファイルが生成されます。
  • オプションは/xjdディレクトリへのリンクをスキップします。ドキュメントに示唆されている以外に、ジャンクションだけでなくシンボリック リンクもスキップします。
  • オプションは/xjfファイルへのリンクをスキップします。ドキュメントに書かれていること以外は、ファイルのジャンクションはスキップしません(そもそも存在しない) ですが、シンボリック リンクです。
  • オプションはと を/xj組み合わせます。/xjd/xjf

私は報告しましたドキュメントの問題

ショートカット(.lnk ファイル)に関するボーナス情報

ショートカットはRobocopyによって通常のファイルと同様に扱われるため、意思一般的に、バックアップ ディレクトリの外部を指します。ただし、他のコマンド ライン プログラムでも、通常は通常のファイルとして扱われます。コマンド プロンプトとdel /s /qMINGW64シェルでこれを確認しましたが、いずれもショートカットに従わないため、意図しない削除は発生しません。rmdir /s /qrm -rf

関連情報