%3F.png)
Безопасно ли удалять резервную копию Robocopy? Я читал, что некоторые люди случайно удаляли файлы вне резервной копии, потому что в ней были ссылки/соединения. Можно ли это предотвратить?
решение1
TheRobocopy документыперечисляет параметры, которые управляют поведением Robocopy относительно ссылок файловой системы:
/sl Не следовать символическим ссылкам, а вместо этого создать копию ссылки.
/xj Исключает точки соединения, которые обычно включены по умолчанию.
/xjd Исключает точки соединения для каталогов.
/xjf Исключает точки соединения для файлов.
Я создал пакетный скрипт, чтобы узнать, как Robocopy работает с этими опциями и без них. Он используетmlink
. С помощью mlink
вы можете создать:
- Символические ссылки на файлы и каталоги.
- Жесткие ссылки на файлы. Попытка создать жесткую ссылку на каталог приводит к ошибке.
- Junctions, которые являются ссылками на каталоги. Попытка создать junction к файлу будет успешной, но junction будет сломан.
Символические ссылки могут быть относительными или абсолютными, в зависимости от того, как вы передаете целевой параметр. Жесткие ссылки и соединения всегда абсолютны, даже если вы передаете относительную цель.
@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-file-absolute | Ссылки на %home%\robocopy-source\b\foo.txt (и на себя) |
robocopy-source\a\symlink-file-absolute | Ссылки на C:\Users\Marco\Desktop\Linktest\robocopy-source\b\foo.txt |
robocopy-source\a\symlink-file-relative | Ссылки на ..\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-file-absolute | Пустой файл |
robocopy-target\a\symlink-file-absolute | Пустой файл |
robocopy-target\a\symlink-file-relative | Пустой файл |
robocopy-target-sl\a\junction-dir-absolute | Каталог со скопированным содержимым %home%\robocopy-source\b\ |
robocopy-target-sl\a\symlink-dir-absolute | Ссылки на %home%\robocopy-source\b\ |
robocopy-target-sl\a\symlink-dir-relative | Ссылка на ..\b\ |
robocopy-target-sl\a\hardlink-file-absolute | Пустой файл |
robocopy-target-sl\a\symlink-file-absolute | Ссылки на %home%\robocopy-source\b\foo.txt |
robocopy-target-sl\a\symlink-file-relative | Ссылки на ..\b\foo.txt |
robocopy-target-xj\a\junction-dir-absolute | Не существует |
robocopy-target-xj\a\symlink-dir-absolute | Не существует |
robocopy-target-xj\a\symlink-dir-relative | Не существует |
robocopy-target-xj\a\hardlink-file-absolute | Пустой файл |
robocopy-target-xj\a\symlink-file-absolute | Не существует |
robocopy-target-xj\a\symlink-file-relative | Не существует |
robocopy-target-xjd\a\junction-dir-absolute | Не существует |
robocopy-target-xjd\a\symlink-dir-absolute | Не существует |
robocopy-target-xjd\a\symlink-dir-relative | Не существует |
robocopy-target-xjd\a\hardlink-file-absolute | Пустой файл |
robocopy-target-xjd\a\symlink-file-absolute | Пустой файл |
robocopy-target-xjd\a\symlink-file-relative | Пустой файл |
robocopy-target-xjf\a\junction-dir-absolute | Каталог со скопированным содержимым %home%\robocopy-source\b\ |
robocopy-target-xjf\a\symlink-dir-absolute | Каталог со скопированным содержимым %home%\robocopy-source\b\ |
robocopy-target-xjf\a\symlink-dir-relative | Каталог со скопированным содержимым %home%\robocopy-source\b\ |
robocopy-target-xjf\a\hardlink-file-absolute | Пустой файл |
robocopy-target-xjf\a\symlink-file-absolute | Не существует |
robocopy-target-xjf\a\symlink-file-relative | Не существует |
Я делаю вывод, что если вы не использовали эту /sl
опцию, удаление резервной копии, созданной с помощью Robocopy, должно быть безопасным. /sl
Однако, если вы использовали эту опцию, абсолютные символические ссылки могут привести к проблемам, напримерпри использовании del
команды.
Дополнительные наблюдения:
- Жесткая ссылка всегда приводит к пустому файлу.
- Опция
/xjd
пропускает ссылки на каталоги. Помимо того, что подразумевается в документации, она пропускает не только соединения, но и символические ссылки! - Опция
/xjf
пропускает ссылки на файлы. За исключением того, что указано в документации, она не пропускает соединения для файлов (которые в любом случае не существуют), а символические ссылки! - Вариант
/xj
объединяет/xjd
и/xjf
.
Я сообщил опроблема с документами.
Дополнительная информация о ярлыках (файлы .lnk)
Robocopy обрабатывает ярлыки как обычные файлы, поэтому ониволяобычно указывают за пределы вашего резервного каталога. Однако они обычно рассматриваются как обычные файлы другими командными программами. Я проверил это для del /s /q
и rmdir /s /q
в командной строке и rm -rf
в оболочке MINGW64, все они не будут следовать сочетаниям клавиш и, таким образом, не приведут к непреднамеренным удалениям.