Robocopy 如何处理文件系统链接(符号链接、硬链接和连接)?

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

  • 很好的回答,马可。非常详细。 (3认同)