
刪除 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 /q
,rmdir /s /q
所有rm -rf
這些都不會遵循快捷方式,因此不會導致意外刪除。