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 文件绝对 链接到 %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 /qrmdir /s /q所有rm -rf这些都不会遵循快捷方式,因此不会导致意外删除。

相关内容