%20%E3%82%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%87%A6%E7%90%86%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
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 /q
MINGW64シェルでこれを確認しましたが、いずれもショートカットに従わないため、意図しない削除は発生しません。rmdir /s /q
rm -rf