Копировать файлы без перезаписи

99

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

Я прошел через копирование, перемещение, xcopy и robocopy, и самое близкое, что я могу получить, это то, что вы можете сказать 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 , или «Надежное копирование файлов», представляет собой команду репликации каталога из командной строки. Он был доступен как часть Windows Resource Kit, начиная с Windows NT 4.0, и был представлен как стандартная функция Windows Vista, Windows 7 и Windows Server 2008.

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

Чтобы уточнить (с использованием ответов Hydrageryrum, HailGallaxar и Энди Шмидта):

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

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

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

Доктор велизарий
источник
Под «исключить» вы имеете в виду «пропустить» или «удалить / удалить»?
Авиаудар
@Andre Terra: Пропустить, обычно. Если вы используете флаг / MIR, он может их удалить. Я этого не проверял.
Hydrageryrum
С / MIR файлы, которые не существуют в источнике, действительно удаляются. Но при использовании также / XN и / XO файлы, существующие в обоих местах, просто пропускаются (не уверен, установлен ли размер). Это идеально подходит для моей ситуации, когда мне нужно скопировать либо более новую, либо старую версию моего приложения, но где штампы dateModified библиотек, которые использует приложение, неверны, но сами имена файлов содержат их номера версии.
Хенно Вермёлен
Нужно ли включать /e? Что, если использовать /sвместо этого? Мне не нужна куча пустых подпапок.
Арете,
48

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

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

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

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

Ртуть
источник
46

Вы можете попробовать это:

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

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

sachin11
источник
2
Красиво просто.
Holf 01
6
почему он отвечает на все вопросы, когда мы трубим только один раз?
phuclv
Потрясающе, я пошел с этим вариантом. Прежде чем думать о трубопроводе, я поискал в Google параметр, который, как мне казалось, мне не хватал, и наткнулся на эту страницу. Пробуя это решение, я заметил, что при подключении к конвейеру копирование явно включает параметр / Y, поэтому необходимо добавить / -Y.
Эндрю
2
@phuclv Кажется, copy /-yпросто автоматически не предполагается, что ни разу не закончится ввод stdin. Вы можете опустить первое явное выражение nили передать < nulего по конвейеру , и произойдет то же самое.
mwfearnley 08
6

Вот он в виде пакетного файла:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
Гейб
источник
3

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

@Hydragiesrum написал:

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

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

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

Приветствую Галаксар
источник
1
Это ответ на исходный вопрос или комментарий к чьему-то ответу?
ASGM
1
Ответ Гидраргрума, набравший +25 голосов на момент написания, является ответом на исходный вопрос или комментарием к чьему-то ответу?
мес.
3

Есть странный способ сделать это с помощью xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

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

Адам говорит - восстановить Монику
источник
Что касается copy, см. Этот ответ , в частности комментарий @mwfearnley: copy /-yавтоматически предполагает, что nпосле того, как stdin исчерпан, поэтому вы можете, например, echo nтолько один раз, и он все еще работает.
rsenna
3
robocopy src dst /MIR /XX

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

be_good_do_good
источник
1

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

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

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

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

Грег
источник
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\

Сделайте тест перед внедрением.

Рамеш
источник