Копирование файлов без перезаписи
Да, это раздражает , когда полезная программа / утилита не имеет , что один « если только он мог . » вариант! В этом случае "--noclobber"!
Используйте rsync и передайте, -u если вы хотите обновить только файлы, которые новее в исходном каталоге, или --ignore-existing пропустить все файлы, которые уже существуют в месте назначения.
(Обратите внимание / на исходную сторону: без этого rsync создастся /remote/directory/directory .)
@ Антон, я не понимаю твой комментарий и не вижу ответа или комментария от Чандры. --ignore-existing добавить без замены, какую потерю данных вы видите?
Извините, я только посмотрел на ваш первый пример, где вы можете потерять данные (и, по-моему, это не то, о чем просил OP), если вы включите --ignore-существующие потери данных не должны произойти.
@Gilles: Да, но все опции, похоже, включают в себя библиотеки Cygwin DLL . (Текущее состояние порта MS OpenSSH таково, что включения сжатия на scp достаточно, чтобы сломать SCP . ) (Получение функциональности rsync поверх Win32 -OpenSSH также кажется нетривиальным - надеюсь, со временем это улучшится) (другой пример - Solaris 10, где требуется сторонний пакет --rsync-path )
scp перезапишет файлы, если у вас есть права на запись в них.
Другими словами: Вы можете scp эффективно пропустить указанные файлы, временно удалив разрешения на запись для них (если вы являетесь владельцем файлов, то есть).
В редких случаях, когда ожидается перезапись только некоторых файлов в каталоге (если они не «защищены»), а права доступа к файлам не одинаковы для разных файлов, это решение может не работать. В остальном это довольно просто и эффективно.
Вы можете копировать только новые файлы по дате. использование find
@FrancisKim это значит измененный 7 дней назад. Так что в этом запросе выбираются любые файлы * .gz, измененные за последние 7 дней
Если вы можете сделать содержимое файла назначения доступным только для чтения:
перед запуском scp (будет пожаловаться и пропустить существующие файлы).
И измените их обратно потом ( chmod +w чтобы получить значение на основе масок). Если не все файлы имеют разрешение на запись в соответствии с вашей маской, вам нужно каким-то образом хранить разрешения, чтобы их можно было восстановить.
(Ответ Жиля перезаписывает существующие файлы, если локально они более новые, я потерял ценные данные таким образом. Не понимаю, почему этот неправильный и вредный ответ имеет так много голосов).
Я получил ошибку , find: missing argument to '-exec' используя эту команду, а вместо этого пришлось использовать: find . -type f -exec chmod a-w <> \; . Мой Linux плох, мммм.
Это лучший и безопасный ответ. Правильная команда для изменения разрешения выглядит как @wpearse: find . -type f -exec chmod a-w <> \;
У меня была похожая задача, в моем случае я не мог использовать rsync , csync или FUSE , потому что мое хранилище имеет только SFTP. rsync Не удалось изменить дату и время для файла, некоторые другие утилиты (например csync ) показывали мне другие ошибки: « Невозможно создать временный файл Обнаружен перекос часов ».
Если у вас есть доступ к хранилищу-серверу - просто установите openssh-server или запустите здесь rsync как демон.
В моем случае - я не мог этого сделать, и решение было: lftp . lftp Использование для синхронизации приведено ниже:
/src/folder - это папка на моем компьютере, /rem/folder - есть sftp://sft.domain.tld/rem/folder .
Я отправляю команды на удаленный компьютер, чтобы он скопировал файл. Я хочу, чтобы файл был скопирован, но не перезаписывать предыдущий файл с тем же именем (если он существует). Мне также нужна команда для запуска без каких-либо подсказок (xcopy любит запрашивать, является ли указанное мною целевое имя файлом или каталогом, а также запрашивать перезапись файла).
нет способа сделать это не перезаписать, насколько я знаю. но /Y заставит его перезаписать. и / я избавлюсь от подсказки file/dict. См. xcopy /? для всех вариантов
У меня хорошие результаты с xcopy /d .
он будет копировать новые файлы, и поскольку мы можем предположить, что существующие файлы имеют одинаковую отметку времени, вы будете копировать только файлы, которые не существуют.
на всякий случай, если кто-нибудь еще найдет это: робокопия x:\sourcefolder Y:\destfolder /s /e /r:0 / z
намного лучше, чем xcopy, даже дает вам таблицу в конце информирования о любых неудачных или пропущенных файлах. Не запрашивает не перезаписывать.
вы также можете использовать команду replace. Он имеет два режима: добавлять файлы, которые там не существуют, или заменять файлы, которые существуют. Вы хотите предыдущий режим:
мне пришлось копировать и переименовывать файлы, поэтому я получил приглашение о создании файла или каталога.
это, скорее, "хакерский" способ, которым я это сделал:
XCOPY будет использовать "F", чтобы указать, что он должен создать цель в виде файла:
Я также проверил, что эта команда оставляет существующие файлы в покое. (Вы тоже должны : -)
Ну, есть определенное средство! Это помогло мне сэкономить много усилий и времени на Win10 при написании настройки для нашей демонстрации продукта.
просто попробуйте использовать трубопроводы:
@ECHO N / COPY / - Y SourceFiles назначения
в качестве примера я использовал его фрагмент кода, чтобы у меня была чистая тихая и безопасная копия!
где, очевидно,FooPath является источником и GooPath назначения.
Я просто не могу найти способ в командной строке сказать: "скопируйте все файлы из каталога A в каталог B, но если файл уже существует в каталоге B, не перезаписывайте его, независимо от того, какой файл новее, и не запрашивайте меня."
Я прошел через copy, move, xcopy & robocopy, и самое близкое, что я могу получить, это то, что вы можете сказать robocopy "копировать A В B, но не перезаписывать новые файлы старыми файлами", но это не работает для меня. Я посмотрел на xxcopy, но отбросил это, поскольку я не хочу иметь стороннюю зависимость от события Visual Studio после сборки, которое потребует от других пользователей SVN установки этого инструмента для выполнения сборки.
Я хочу добавить командную строку в событие после сборки в Visual Studio 2010, чтобы файлы, созданные из T4 шаблоны для нового EF объекты модели распространяются в папки проекта, к которым они принадлежат, но регенерированные файлы для существующих объектов не перезаписать потенциально отредактированные файлы назначения.
поскольку шаблон T4 восстанавливается, исходный файл всегда новее, и я не могу использовать "новый" переключатель надежно, я не думаю.
Я использую частичные классы для тех элементов, для которых я могу, но есть другие вещи, которые я генерирую, которые не могут использовать частичные классы (например, создание EditorTemplate по умолчанию или DisplayTemplate *.файл ascx).
У кого-нибудь есть подобные проблемы, которые они решили?
Robocopy, или "надежная копия файла", является командой репликации каталога командной строки. Он был доступен как часть набора ресурсов Windows, начиная с Windows NT 4.0, и был представлен как стандартная функция Windows Vista, Windows 7 и Windows Server 2008.
подробнее (используя ответы Hydrargyrum, HailGallaxar и Andy Schmidt):
- /E делает Robocopy рекурсивно поддиректории копия , включая пустые.
- /XC исключает существующие файлы с времени, но разные размер файла. Программы обычно перезаписывает.
- /XN исключает существующие файлы новыми чем копия в пункте назначения справочник. В Robocopy нормально переписывает их.
- /XO исключает существующие файлы старше чем копия в пункте назначения справочник. В Robocopy нормально переписывает их.
С Измененные, старые и новые классы исключены, Robocopy делает именно то, что хочет оригинальный плакат - без необходимости загружать среду сценариев.
решение Велисария хорошее.
чтобы уточнить этот немного краткий ответ:
- /E делает Robocopy рекурсивно копировать подкаталоги, включая пустые.
- /XC исключает существующие файлы с времени, но разные размер файла. Программы обычно перезаписывает.
- /XN исключает существующие файлы новыми чем копия в источнике справочник. В Robocopy нормально переписывает их.
- /XO исключает существующие файлы старше чем копия в источнике справочник. В Robocopy нормально переписывает их.
с измененными, старыми и новыми исключенными классами Robocopy делает именно то, что хочет оригинальный плакат - без необходимости загружать среду сценариев.
Вы можете попробовать это:
-y просто запрашивает перед перезаписью, и мы можем передать n НА ВСЕ эти вопросы. Таким образом, это, по сути, просто копирует несуществующие файлы. :)
Я пытаюсь найти простой способ развертывания только измененных файлов на веб-сервер для развертывания. В прошлом я использовал MSBuild, который можно было бы сказать только для копирования файлов, которые были новее, чем те, что на цели, но я спешу и не хочу пытаться выяснить более новую версию MSBuild.
могу ли я использовать ROBOCOPY для этого? Существует список вариантов исключения, который:
- / XC :: исключить измененные файлы.
- / XN :: исключить новые файлы.
- /XO:: исключить старые файлы.
- / XX:: исключить дополнительные файлы и каталоги.
- / XL:: исключить одиночные файлы и каталоги.
Что именно означает исключить? Исключить копирование или перезапись? Например, если бы я написал:
ROBOCOPY C:SourceFolderABC - . dll D:DestinationFolder / XO
будет ли это копировать только новые файлы, а не файлы того же возраста?
или есть лучший инструмент для этого?
чтобы ответить на все ваши вопросы:
могу ли я использовать ROBOCOPY для этого?
Да, RC должен соответствовать вашим требованиям (простота, только скопируйте то, что нужно)
что именно означает исключить?
Это исключит копирование-RC называет это пропуск
Б /XO опция копировать только новые файлы, а не файлы того же возраста?
Да, RC будет копировать только новые файлы. Файлы того же возраста будут пропущены.
(правильная команда будет robocopy C:\SourceFolder D:\DestinationFolder ABC.dll /XO )
может быть, в вашем случае с помощью /MIR опция может быть полезна. В целом RC ориентирован скорее на каталоги и деревья каталогов, чем на отдельные файлы.
вы можете использовать robocopy для копирования файлов с флагом архива и сброса атрибута. Используйте командную строку /M, это мой сценарий резервного копирования с несколькими дополнительными трюками.
этот скрипт должен NirCmd инструмент для перемещения мыши, чтобы моя машина не засыпала. Скрипт использует lockfile, чтобы сообщить, когда сценарий резервного копирования завершен и mousemove.bat скрипт закрыт. Эту часть вы можете опустить.
другое 7-Zip инструмент для разделения virtualbox файлы меньше, чем файлы 4GB, моя папка назначения по-прежнему FAT32, поэтому это обязательно. Я должен использовать диск NTFS, но еще не преобразовал резервные диски.
резервное копирование-robocopy.летучая мышь!--15-->
резервное копирование-robocopy-работа.rcj
резервное копирование-robocopy-movemouse.летучая мышь!--15-->
выглядит так: /e опция-это то, что вам нужно, она пропустит те же файлы/каталоги.
Если вы запустите команду дважды, вы увидите, что второй раунд намного быстрее, так как он пропускает много вещей.
Я просто не могу найти способ в командной строке сказать “скопируйте все файлы из каталога 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).
Есть ли у кого-нибудь подобные проблемы, которые они решили?
Robocopy или “Robust File Copy” – команда репликации в командной строке. Он был доступен как часть набора ресурсов Windows, начиная с Windows NT 4.0, и был представлен как стандартная функция Windows Vista, Windows 7 и Windows Server 2008.
Разработать (используя ответы Hydrargyrum, HailGallaxar и Andy Schmidt):
- /E позволяет Robocopy рекурсивно копировать подкаталоги,
включая пустые. - /XC исключает существующие файлы с
та же самая временная метка, но другая
размер файла. Robocopy обычно перезаписывает их. - /XN исключает существующие файлы newer
чем копия в месте назначения
каталог. Robocopy обычно
перезаписывает их. - /XO исключает
существующие файлы старше
чем копия в месте назначения
каталог. Robocopy обычно
перезаписывает их.
Если классы Changed, Older и Newer исключены, Robocopy делает именно то, что хочет исходный плакат – без необходимости загружать среду сценариев.
Ссылки: Technet, Wikipedia
Загрузить с: Ссылка для загрузки Microsoft (Ссылка последней проверке 30 марта 2016 г.)
Решение Велисария хорошее.
Чтобы уточнить этот слегка краткий ответ:
- /E позволяет Robocopy рекурсивно копировать подкаталоги,
включая пустые. - /XC исключает существующие файлы с
та же самая временная метка, но другая
размер файла. Robocopy обычно перезаписывает их. - /XN исключает существующие файлы
чем копия в источнике
каталог. Robocopy обычно
перезаписывает их. - /XO исключает
существующие файлы старше
чем копия в источнике
каталог. Robocopy обычно
перезаписывает их.
Если классы Changed, Older и Newer исключены, Robocopy делает именно то, что хочет исходный плакат – без необходимости загружать среду сценариев.
Вы можете попробовать следующее:
-y просто запрашивает перед перезаписью, и мы можем передать n всем этим вопросам. Таким образом, это по существу просто копирует несуществующие файлы.:)
Здесь он находится в виде пакетного файла:
Я просто хочу прояснить что-то из собственного тестирования.
@Hydrargyrum писал (а):
- /XN исключает существующие файлы, более новые, чем копия в исходном каталоге. Robocopy обычно перезаписывает их.
- /XO исключает существующие файлы старше, чем копия в исходном каталоге. Robocopy обычно перезаписывает их.
Это наоборот. XN делает файлы “eXclude Newer”, но исключает файлы, которые являются более новыми, чем копия в целевом каталоге. XO делает “eXclude Older”, но исключает файлы, которые старше копии в целевом каталоге.
Конечно, проводите собственное тестирование, как всегда.
Существует нечетный способ сделать это с помощью xcopy:
Просто включите столько n, сколько файлов, которые вы копируете, и ответьте n на все перезаписываемые вопросы.
/XX: eXclude “eXtra” файлы и директории (присутствующие в пункте назначения, но не исходные). Это предотвратит удаление из адресата. (это значение по умолчанию)
Robocopy можно скачать здесь для систем, где он уже не установлен. (I.e. Windows Server 2003.)
Не забудьте указать свой путь к robocopy exe. Вы делаете это, щелкнув правой кнопкой мыши “Мой компьютер” > “Свойства” > “Дополнительно” > “Переменные среды”, затем найдите системную переменную пути и добавьте это в конец: “; C:\Program Files\Windows Resource Kits\Tools” или где угодно установил его. Не забудьте оставить строки переменной пути, которые уже есть, и просто добавить дополнительный путь.
Как только путь будет установлен, вы можете запустить команду, предложенную им. Он отлично работает.
Параметр Exclude Older/Newer совместим с информацией, отображаемой в протоколе RoboCopy: RoboCopy будет выполнять итерацию через SOURCE, а затем сообщать, является ли каждый файл в SOURCE “OLDER” или “NEWER”, чем файл в целевом каталоге.
Следовательно,/XO будет исключать файлы OLDER SOURCE (что является интуитивно понятным), а не “старше источника”, как было заявлено здесь.
Если вы хотите скопировать только новые или измененные исходные файлы, но избегайте замены более поздних файлов назначения, тогда /XO является правильным вариантом.
Простым подходом было бы использовать параметр /MIR для зеркального отображения двух каталогов. В основном он копирует только новые файлы в пункт назначения. В следующем списке замените источник и место назначения на пути к вашим папкам, script будет искать любой файл с любыми расширениями.
Это то, что сработало для меня. Я использую это, чтобы “добавить” файлы на другой диск без перезаписи.
Читайте также: