Копіюйте файли без перезапису


99

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

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

Я хочу додати командний рядок до події після збирання у Visual Studio 2010, щоб файли, що генеруються із шаблонів T4 для нових об’єктів моделі EF, поширювались у папки проекту, до яких вони належать, але регенеровані файли для існуючих об'єктів не перезаписувати потенційно відредаговані файли призначення.

Оскільки шаблон T4 відновлюється, вихідний файл завжди новіший, і я не можу надійно використовувати перемикач «новіший», я не думаю.

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

У когось є подібні проблеми, які вони вирішили?


Чи знайомі ви з командою cmd.exe's for? Якщо ні, то рекомендую запустити for /?та скористатися цим.
Гейб

Відповіді:


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

5
Це працювало для мене, але мені довелося використовувати два відсотки символів замість одного, оскільки я запускав це всередині пакетного файлу, а не командного рядка. Я замінив екземпляри% F на %% F, а екземпляри% ~ nxF на %% ~ nxF.
Оуен

1
Що ~nxв %~nxFточності означає?
Серж Рогач

@stu, це говорить лише про те, що ~nxFзмінна Fперетворюється на ім'я файлу та розширення.
Серж Рогач

Так, настільки ефективно, дайте мені ім'я файлу + розширення, без шляху - це те, що вам потрібно зробити тест у цільовій папці та вказати ім'я цільового файлу. Справа в тому, що% F включає шлях, і ви цього не хочете.
Ст

207

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 Робокопія робить рекурсивно копіювати підкаталоги, включаючи порожні.
  • /XCвиключає наявні файли з однаковою міткою часу, але різними розмірами файлів. Робокопія зазвичай перезаписує їх.
  • /XNвиключає наявні файли, новіші за копію, в каталозі призначення. Робокопія зазвичай перезаписує їх.
  • /XOвиключає наявні файли, старші за копію, в каталозі призначення. Робокопія зазвичай перезаписує їх.

За винятком класів Змінені, Старіші та Новіші, Robocopy робить саме те, що хоче оригінальний плакат, не потребуючи завантаження сценарію.

Список літератури: Technet , Wikipedia
Завантажити з: Посилання для завантаження Microsoft (Посилання останнє підтверджено 30 березня 2016 р.)


Під "виключити" ви маєте на увазі "пропустити" або "видалити / видалити"?
авіаудар

@Andre Terra: Пропустити, нормально. Якщо ви використовуєте прапор / MIR, він може видалити їх. Я цього не перевіряв.
Hydrargyrum

За допомогою / MIR файли, які не існують у джерелі, дійсно видаляються. Але при використанні / XN та / XO файли, які існують в обох місцях, просто пропускаються (не впевнений, чи розмір встановлений). Це ідеально підходить для моєї ситуації, коли мені потрібно скопіювати або більш нову, або старішу версію моєї програми, але там, де марки змінених датами бібліотек, якими користується програма, неправильні, але самі назви файлів містять номер версії.
Henno Vermeulen

Чи потрібно включати /e? Що робити, якщо ви використовуєте /sнатомість? Я не хочу купу порожніх папок.
Арете

48

Рішення Велізарія добре.

Щоб детальніше зупинитися на цій дещо лаконічній відповіді:

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

За винятком класів Змінені, Старіші та Новіші, Robocopy робить саме те, що хоче оригінальний плакат, не потребуючи завантаження сценарію.


46

Ви можете спробувати це:

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

-yпросто запитає перед перезаписом, і ми можемо подати n на всі ці питання. Отже, це по суті було б просто скопіювати неіснуючі файли. :)


2
Красиво просто.
Гольф

6
чому він відповідає на всі запитання, коли ми проводимо лише один раз?
phuclv

Дивовижно, я пішов з цим варіантом. Перш ніж подумати про трубопроводи, я поглянув на параметр, який вважав, що я відсутній, і тоді я перейшов на цю сторінку. Спробувавши це рішення, я помітив, що при трубопроводі копія, мабуть, включає параметр / Y, тож тому / -Y потрібно додати.
Андрій

2
@phuclv Здається, що copy /-yце автоматично автоматично передбачає, що жодного разу у stdin не закінчиться вхід. Ви можете опустити перше явне nабо трубу < nulв нього, і те саме відбувається.
mwfearnley

6

Ось він знаходиться в пакетній формі файлу:

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

3

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

@Hydrargyrum написав:

  • / XN виключає наявні файли, новіші за копію у вихідному каталозі. Робокопія зазвичай перезаписує їх.
  • / XO виключає наявні файли, старші за копію у вихідному каталозі. Робокопія зазвичай перезаписує їх.

Це насправді назад. XN робить "eXclude Newer" файли, але він виключає файли, новіші за копію в цільовому каталозі. XO робить "eXclude Older", але він виключає файли, старші за копію в каталозі призначення .

Звичайно, робіть власне тестування, як завжди.


1
Це відповідь на початкове запитання чи коментар до чужої відповіді?
ASGM

1
Чи є відповідь Hydrargyrum, що на момент написання відповіді на оригінальне запитання налічував +25 голосів, чи коментар до чужої відповіді?
мо.

3

Існує дивний спосіб зробити це за допомогою xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

Просто включіть стільки n, скільки файлів, які ви копіюєте, і вони відповідуть n на всі запитання, що перезаписуються.


Що стосується copy, дивіться цю відповідь , зокрема коментар @mwfearnley: copy /-yавтоматично передбачається , що стдин nвичерпується, тому ви можете, наприклад, echo nлише один раз, і він все ще працює.
rsenna

3
robocopy src dst /MIR /XX

/ XX: eXclude "eXtra" файли та режими (присутні у пункті призначення, але не у джерелі). Це запобіжить будь-яке видалення з пункту призначення. (це за замовчуванням)


1

Робокопію можна завантажити тут для систем, де вона ще не встановлена. (Тобто Windows Server 2003.)

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

Не забудьте встановити свій шлях до файлу роботокопії. Виконайте це, клацнувши правою кнопкою миші "мій комп'ютер"> властивості> розширено> "Змінні середовища", потім знайдіть змінну системи шляху та додайте це до кінця: "; C: \ Файли програм \ Набори ресурсів Windows \ Інструменти" або де б ви не знаходилися встановив його. Обов’язково залиште рядки змінної контуру, які вже є, і просто додайте додатковий шлях.

як тільки шлях встановлений, ви можете запустити команду, яку пропонує Велізарій. Це чудово працює.


1

Це не дозволить мені прямо коментувати неправильні повідомлення - але дозвольте мені лише попередити всіх, що визначення параметрів / XN та / XO ПОВЕРНЕНО порівняно з тим, що було розміщено в попередніх повідомленнях.

Параметр Виключити старіші / новіші файли узгоджується з інформацією, що відображається в журналі RoboCopy: RoboCopy буде повторювати ДЖЕРЕЛО, а потім повідомляє про те, чи є кожен файл із ДЖЕРЕЛОУ "СТАРШЕ" чи "НОВІШ", ніж файл у пункті призначення.

Отже, / XO виключить файли ДРУГІ ДЖЕРЕЛА (які є інтуїтивно зрозумілими), а не "старіші за джерело", як заявлено тут.

Якщо ви хочете скопіювати лише нові або змінені вихідні файли, але уникати заміни новіших файлів призначення, то / XO - це правильний варіант використання.


0

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

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

0

Це те, що для мене спрацювало. Я використовую це для "додавання" файлів на інший диск, без перезаписів.

Пакетний файл: 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\

Зробіть тест перед впровадженням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.