Mar*_*ein 6 symbolic-link hardlink robocopy junction
删除 Robocopy 备份是否安全?我读到有些人意外删除了备份之外的文件,因为它包含链接/连接。我可以阻止这种情况吗?
Mar*_*ein 18
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
Run Code Online (Sandbox Code Playgroud)
使用Link Shell Extension,我们现在可以看到发生了什么:
| 小路 | 信息 |
|---|---|
| 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-源\a\硬链接文件-绝对 | 链接到 %home%\robocopy-source\b\foo.txt (及其本身) |
| robocopy-源\a\符号链接文件-绝对 | 链接到 C:\Users\Marco\Desktop\Linktest\robocopy-source\b\foo.txt |
| robocopy-source\a\symlink-file-relative | 链接到 ..\b\foo.txt |
| robocopy-目标\a\junction-dir-绝对 | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-target\a\symlink-dir-absolute | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-目标\a\符号链接目录相对 | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-目标\a\硬链接文件-绝对 | 空的文件 |
| robocopy-目标\a\符号链接文件-绝对 | 空的文件 |
| robocopy-目标\a\符号链接文件相对 | 空的文件 |
| robocopy-目标-sl\a\junction-dir-绝对 | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-目标-sl\a\符号链接-dir-绝对 | 链接到 %home%\robocopy-source\b\ |
| robocopy-目标-sl\a\符号链接目录相对 | 链接到..\b\ |
| robocopy-目标-sl\a\硬链接文件-绝对 | 空的文件 |
| robocopy-目标-sl\a\符号链接文件-绝对 | 链接到 %home%\robocopy-source\b\foo.txt |
| robocopy-目标-sl\a\符号链接文件相对 | 链接到 ..\b\foo.txt |
| robocopy-目标-xj\a\junction-dir-绝对 | 不存在 |
| robocopy-目标-xj\a\symlink-dir-absolute | 不存在 |
| robocopy-目标-xj\a\symlink-dir-relative | 不存在 |
| robocopy-目标-xj\a\hardlink-文件-绝对 | 空的文件 |
| robocopy-目标-xj\a\符号链接文件-绝对 | 不存在 |
| robocopy-目标-xj\a\符号链接文件相对 | 不存在 |
| robocopy-目标-xjd\a\junction-dir-绝对 | 不存在 |
| robocopy-目标-xjd\a\symlink-dir-absolute | 不存在 |
| robocopy-目标-xjd\a\symlink-dir-relative | 不存在 |
| robocopy-目标-xjd\a\hardlink-文件-绝对 | 空的文件 |
| robocopy-目标-xjd\a\符号链接文件-绝对 | 空的文件 |
| robocopy-目标-xjd\a\符号链接文件相对 | 空的文件 |
| robocopy-目标-xjf\a\junction-dir-绝对 | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-目标-xjf\a\symlink-dir-absolute | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-目标-xjf\a\符号链接目录相对 | 复制内容为 %home%\robocopy-source\b\ 的目录 |
| robocopy-目标-xjf\a\hardlink-文件-绝对 | 空的文件 |
| robocopy-目标-xjf\a\符号链接文件-绝对 | 不存在 |
| robocopy-目标-xjf\a\符号链接文件相对 | 不存在 |
我的结论是,除非您使用过该/sl选项,否则删除使用 Robocopy 创建的备份应该是安全的。但是,如果您确实使用了该/sl选项,绝对符号链接可能会给您带来麻烦,例如在使用del命令时。
进一步观察:
/xjd跳过目录链接。除了文档暗示的之外,它不仅跳过连接点,还跳过符号链接!/xjf跳过文件链接。除了文档暗示之外,它不会跳过文件的连接(无论如何都不存在),而是跳过符号链接!/xj结合了/xjd和/xjf。我已通过文档报告了该问题。
有关快捷方式的额外信息(.lnk 文件)
Robocopy 将快捷方式视为常规文件,因此它们通常会指向备份目录之外。但是,其他命令行程序通常也将它们视为常规文件。我已经在命令提示符和del /s /qMINGW64 shell 中检查了这一点,所有这些都不会遵循快捷方式,因此不会导致意外删除。rmdir /s /qrm -rf