删除 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 文件绝对 | 链接到 %home%\robocopy-source\b\foo.txt (及其本身) |
robocopy-source\a\symlink 文件绝对 | 链接到 C:\Users\Marco\Desktop\Linktest\robocopy-source\b\foo.txt |
robocopy-source\a\symlink 文件相对 | 链接到 ..\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 文件绝对 | 空的文件 |
robocopy-target\a\symlink 文件绝对 | 空的文件 |
robocopy-target\a\symlink 文件相对 | 空的文件 |
robocopy-目标-sl\a\junction-dir-absolute | %home%\robocopy-source\b\ 的复制内容目录 |
robocopy-目标-sl\a\symlink-dir-absolute | 链接至 %home%\robocopy-source\b\ |
robocopy-目标-sl\a\symlink-dir-relative | 链接到..\b\ |
robocopy-目标-sl\a\hardlink 文件绝对 | 空的文件 |
robocopy-目标-sl\a\符号链接文件绝对 | %home%\robocopy-source\b\foo.txt 的链接 |
robocopy-目标-sl\a\symlink 文件相对 | 链接到 ..\b\foo.txt |
robocopy-目标-xj\a\junction-dir-absolute | 不存在 |
robocopy-目标-xj\a\symlink-dir-absolute | 不存在 |
robocopy-目标-xj\a\symlink-dir-relative | 不存在 |
robocopy-目标-xj\a\hardlink 文件绝对 | 空的文件 |
robocopy-目标-xj\a\符号链接文件绝对 | 不存在 |
robocopy-目标-xj\a\symlink 文件相对 | 不存在 |
robocopy-目标-xjd\a\junction-dir-absolute | 不存在 |
robocopy-目标-xjd\a\symlink-dir-absolute | 不存在 |
robocopy-目标-xjd\a\symlink-dir-relative | 不存在 |
robocopy-目标-xjd\a\hardlink 文件绝对 | 空的文件 |
robocopy-目标-xjd\a\符号链接文件绝对 | 空的文件 |
robocopy-目标-xjd\a\symlink 文件相对 | 空的文件 |
robocopy-目标-xjf\a\junction-dir-absolute | %home%\robocopy-source\b\ 的复制内容目录 |
robocopy-目标-xjf\a\symlink-dir-absolute | %home%\robocopy-source\b\ 的复制内容目录 |
robocopy-目标-xjf\a\symlink-dir-relative | %home%\robocopy-source\b\ 的复制内容目录 |
robocopy-目标-xjf\a\hardlink 文件绝对 | 空的文件 |
robocopy-目标-xjf\a\符号链接文件绝对 | 不存在 |
robocopy-目标-xjf\a\symlink 文件相对 | 不存在 |
我得出的结论是,除非您使用了该/sl
选项,否则删除使用 Robocopy 创建的备份应该是安全的。/sl
但是,如果您确实使用了该选项,绝对符号链接可能会给您带来麻烦,例如使用del
命令时。
进一步观察:
- 硬链接总是产生一个空文件。
- 选项
/xjd
跳过目录链接。除了文档暗示之外,它不仅跳过连接点,还跳过符号链接! - 选项
/xjf
跳过文件链接。除了文档暗示之外,它不会跳过文件的连接点(根本不存在),而是符号链接! - 选项
/xj
结合了/xjd
和/xjf
。
我已经举报文档问题。
有关快捷方式(.lnk 文件)的额外信息
Robocopy 将快捷方式视为常规文件,因此它们将要通常指向备份目录之外。但是,其他命令行程序通常也会将它们视为常规文件。我已经在命令提示符和 MINGW64 shell 中检查了这一点del /s /q
,rmdir /s /q
所有rm -rf
这些都不会遵循快捷方式,因此不会导致意外删除。