Как Robocopy обрабатывает ссылки файловой системы (символические ссылки, жесткие ссылки и соединения)?

Как Robocopy обрабатывает ссылки файловой системы (символические ссылки, жесткие ссылки и соединения)?

Безопасно ли удалять резервную копию 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, все они не будут следовать сочетаниям клавиш и, таким образом, не приведут к непреднамеренным удалениям.

Связанный контент