Скопировать файлы без перезаписывания

Я просто не могу найти способ в командной строке сказать "скопируйте все файлы из каталога A в каталог B, но если файл уже существует в каталоге B, не перезаписывайте его, независимо от того, какой файл более новый, и не запрашивайте меня".

Я прошел через копирование, перемещение, xcopy и robocopy, и самое близкое, что я могу получить, это то, что вы можете сказать robocopy "копировать A в B, но не перезаписывать более старые файлы с более старыми файлами", но это не работа для меня. Я посмотрел на xxcopy, но отменил его, так как не хочу иметь зависимостей сторонних разработчиков от события post-build Visual Studio, для чего другим пользователям SVN потребуется установить этот инструмент для сборки.

Я хочу добавить командную строку в событие post-build в Visual Studio 2010, чтобы файлы, созданные из T4 шаблоны для новых объектов EF распределяются по папкам проекта, к которым они принадлежат, но регенерированные файлы для существующих объектов не перезаписывают потенциально редактируемый пункт назначения файлы.

Поскольку шаблон T4 восстанавливается, исходный файл всегда более новый, и я не могу надежно использовать "новый" переключатель, я не думаю.

Я использую частичные классы для тех элементов, для которых могу, но есть другие вещи, которые я генерирую, которые не могут использовать частичные классы (например, создание файла EditorTemplate по умолчанию или DisplayTemplate *.ascx).

Есть ли у кого-нибудь подобные проблемы, которые они решили?

Ответ 1

For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"

Ответ 2

Robocopy или "Robust File Copy" - команда репликации в командной строке. Он был доступен как часть набора ресурсов Windows, начиная с Windows NT 4.0, и был представлен как стандартная функция Windows Vista, Windows 7 и Windows Server 2008.

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

Разработать (используя ответы Hydrargyrum, HailGallaxar и Andy Schmidt):

  • /E позволяет Robocopy рекурсивно копировать подкаталоги, включая пустые.
  • /XC исключает существующие файлы с та же самая временная метка, но другая размер файла. Robocopy обычно перезаписывает их.
  • /XN исключает существующие файлы newer чем копия в месте назначения каталог. Robocopy обычно перезаписывает их.
  • /XO исключает существующие файлы старше чем копия в месте назначения каталог. Robocopy обычно перезаписывает их.

Если классы Changed, Older и Newer исключены, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.

Ссылки: Technet, Wikipedia
Загрузить с: Ссылка для загрузки Microsoft (Ссылка последней проверке 30 марта 2016 г.)

Ответ 3

Решение Велисария хорошее.

Чтобы уточнить этот слегка краткий ответ:

  • /E позволяет Robocopy рекурсивно копировать подкаталоги, включая пустые.
  • /XC исключает существующие файлы с та же самая временная метка, но другая размер файла. Robocopy обычно перезаписывает их.
  • /XN исключает существующие файлы чем копия в источнике каталог. Robocopy обычно перезаписывает их.
  • /XO исключает существующие файлы старше чем копия в источнике каталог. Robocopy обычно перезаписывает их.

Если классы Changed, Older и Newer исключены, Robocopy делает именно то, что хочет исходный плакат - без необходимости загружать среду сценариев.

Ответ 4

Вы можете попробовать следующее:

echo n | copy /-y <SOURCE> <DESTINATION>

-y просто запрашивает перед перезаписью, и мы можем передать n всем этим вопросам. Таким образом, это по существу просто копирует несуществующие файлы.:)

Ответ 5

Здесь он находится в виде пакетного файла:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"

Ответ 6

Я просто хочу прояснить что-то из собственного тестирования.

@Hydrargyrum писал (а):

  • /XN исключает существующие файлы, более новые, чем копия в исходном каталоге. Robocopy обычно перезаписывает их.
  • /XO исключает существующие файлы старше, чем копия в исходном каталоге. Robocopy обычно перезаписывает их.

Это наоборот. XN делает файлы "eXclude Newer", но исключает файлы, которые являются более новыми, чем копия в целевом каталоге. XO делает "eXclude Older", но исключает файлы, которые старше копии в целевом каталоге.

Конечно, проводите собственное тестирование, как всегда.

Ответ 7

Существует нечетный способ сделать это с помощью xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Просто включите столько n, сколько файлов, которые вы копируете, и ответьте n на все перезаписываемые вопросы.

Ответ 8

robocopy src dst /MIR /XX

/XX: eXclude "eXtra" файлы и директории (присутствующие в пункте назначения, но не исходные). Это предотвратит удаление из адресата. (это значение по умолчанию)

Ответ 9

Robocopy можно скачать здесь для систем, где он уже не установлен. (I.e. Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (для установки не требуется перезагрузка)

Не забудьте указать свой путь к robocopy exe. Вы делаете это, щелкнув правой кнопкой мыши "Мой компьютер" > "Свойства" > "Дополнительно" > "Переменные среды", затем найдите системную переменную пути и добавьте это в конец: "; C:\Program Files\Windows Resource Kits\Tools" или где угодно установил его. Не забудьте оставить строки переменной пути, которые уже есть, и просто добавить дополнительный путь.

Как только путь будет установлен, вы можете запустить команду, предложенную им. Он отлично работает.

Ответ 10

Это не позволит мне прокомментировать непосредственно неправильные сообщения, но позвольте мне просто предупредить всех, что определение опций /XN и/XO REVERSED по сравнению с тем, что было опубликовано в предыдущих сообщениях.

Параметр Exclude Older/Newer совместим с информацией, отображаемой в протоколе RoboCopy: RoboCopy будет выполнять итерацию через SOURCE, а затем сообщать, является ли каждый файл в SOURCE "OLDER" или "NEWER", чем файл в целевом каталоге.

Следовательно,/XO будет исключать файлы OLDER SOURCE (что является интуитивно понятным), а не "старше источника", как было заявлено здесь.

Если вы хотите скопировать только новые или измененные исходные файлы, но избегайте замены более поздних файлов назначения, тогда /XO является правильным вариантом.

Ответ 11

Простым подходом было бы использовать параметр /MIR для зеркального отображения двух каталогов. В основном он копирует только новые файлы в пункт назначения. В следующем списке замените источник и место назначения на пути к вашим папкам, script будет искать любой файл с любыми расширениями.

robocopy <source directory> <destination directory> *.* /MIR

Ответ 12

Это то, что сработало для меня. Я использую это, чтобы "добавить" файлы на другой диск без перезаписи.

Пакетный файл: robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

Пример:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

Проведите проверку перед реализацией.