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-來源\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 將快捷方式視為常規文件,因此它們將要通常指向備份目錄之外。但是,其他命令列程式通常也將它們視為常規檔案。我已經在命令提示字元和 MINGW64 shell 中檢查了這一點del /s /qrmdir /s /q所有rm -rf這些都不會遵循快捷方式,因此不會導致意外刪除。

相關內容