Использовать Robocopy для копирования только измененных файлов?
Я пытаюсь найти простой способ развертывания только измененных файлов на веб-сервере для развертывания. В прошлом я использовал MSBuild, которому можно было только скопировать файлы, которые были более новыми, чем те, которые были на целевом компьютере, но я спешу и не хочу пытаться выяснить более новую версию MSBuild.
Могу ли я использовать ROBOCOPY для этого? Существует список вариантов исключения:
- /XC:: eXclude Измененные файлы.
- /XN:: eXclude Новые файлы.
- /XO:: eXclude Старые файлы.
- /XX:: eXclude eXtra файлы и каталоги.
- /XL:: eXclude Одинокие файлы и каталоги.
Что именно означает исключить? Исключить копирование или исключить перезапись? Например, если я написал:
ROBOCOPY C:\SourceFolder\ABC.dll D:\DestinationFolder/XO
будет ли это копировать только более новые файлы, а не файлы того же возраста?
Или есть лучший инструмент для этого?
Ответы
Ответ 1
Чтобы ответить на все ваши вопросы:
Могу ли я использовать ROBOCOPY для этого?
Да, RC должен соответствовать вашим требованиям (простота, только скопируйте то, что нужно)
Что именно означает исключить?
Это исключает копирование - вызовы RC, которые он пропускает
Будет ли параметр /XO
копировать только новые файлы, а не файлы того же возраста?
Да, RC будет копировать только новые файлы. Файлы того же возраста будут пропущены.
(правильная команда будет robocopy C:\SourceFolder D:\DestinationFolder ABC.dll /XO
)
Возможно, в вашем случае использование опции /MIR
может быть полезно. В общем случае RC довольно ориентирован на каталоги и деревья каталогов, чем отдельные файлы.
Ответ 2
Вы можете использовать robocopy для копирования файлов с флагом архива и атрибутом reset. Используйте командную строку /M, это моя резервная копия script с несколькими дополнительными трюками.
Этот script нуждается в инструменте NirCmd, чтобы поддерживать перемещение мыши, чтобы моя машина не попала в спящий режим. script использует файл блокировки, чтобы сообщить, когда завершится резервное копирование script, и mousemove.bat script закрыт. Вы можете оставить эту часть.
Другим является 7-Zip инструмент для разделения файлов виртуальных файлов размером менее 4 ГБ, моя папка назначения по-прежнему FAT32, поэтому это является обязательным. Я должен использовать диск NTFS, но еще не преобразовал резервные диски.
резервного копирования robocopy.bat
@REM https://technet.microsoft.com/en-us/library/cc733145.aspx
@REM http://www.skonet.com/articles_archive/robocopy_job_template.aspx
set basedir=%~dp0
del /Q %basedir%backup-robocopy-log.txt
set dt=%date%_%time:~0,8%
echo "%dt% robocopy started" > %basedir%backup-robocopy-lock.txt
start "Keep system awake" /MIN /LOW cmd.exe /C %basedir%backup-robocopy-movemouse.bat
set dest=E:\backup
call :BACKUP "Program Files\MariaDB 5.5\data"
call :BACKUP "projects"
call :BACKUP "Users\Myname"
:SPLIT
@REM Split +4GB file to multiple files to support FAT32 destination disk,
@REM splitted files must be stored outside of the robocopy destination folder.
set srcfile=C:\Users\Myname\VirtualBox VMs\Ubuntu\Ubuntu.vdi
set dstfile=%dest%\Users\Myname\VirtualBox VMs\Ubuntu\Ubuntu.vdi
set dstfile2=%dest%\non-robocopy\Users\Myname\VirtualBox VMs\Ubuntu\Ubuntu.vdi
IF NOT EXIST "%dstfile%" (
IF NOT EXIST "%dstfile2%.7z.001" attrib +A "%srcfile%"
dir /b /aa "%srcfile%" && (
del /Q "%dstfile2%.7z.*"
c:\apps\commands\7za.exe -mx0 -v4000m u "%dstfile2%.7z" "%srcfile%"
attrib -A "%srcfile%"
@set dt=%date%_%time:~0,8%
@echo %dt% Splitted %srcfile% >> %basedir%backup-robocopy-log.txt
)
)
del /Q %basedir%backup-robocopy-lock.txt
GOTO :END
:BACKUP
TITLE Backup %~1
robocopy.exe "c:\%~1" "%dest%\%~1" /JOB:%basedir%backup-robocopy-job.rcj
GOTO :EOF
:END
@set dt=%date%_%time:~0,8%
@echo %dt% robocopy completed >> %basedir%backup-robocopy-log.txt
@echo %dt% robocopy completed
@pause
резервного копирования Robocopy-job.rcj
:: Robocopy Job Parameters
:: robocopy.exe "c:\projects" "E:\backup\projects" /JOB:backup-robocopy-job.rcj
:: Source Directory (this is given in command line)
::/SD:c:\examplefolder
:: Destination Directory (this is given in command line)
::/DD:E:\backup\examplefolder
:: Include files matching these names
/IF
*.*
/M :: copy only files with the Archive attribute and reset it.
/XJD :: eXclude Junction points for Directories.
:: Exclude Directories
/XD
C:\projects\bak
C:\projects\old
C:\project\tomcat\logs
C:\project\tomcat\work
C:\Users\Myname\.eclipse
C:\Users\Myname\.m2
C:\Users\Myname\.thumbnails
C:\Users\Myname\AppData
C:\Users\Myname\Favorites
C:\Users\Myname\Links
C:\Users\Myname\Saved Games
C:\Users\Myname\Searches
:: Exclude files matching these names
/XF
C:\Users\Myname\ntuser.dat
*.~bpl
:: Exclude files with any of the given Attributes set
:: S=System, H=Hidden
/XA:SH
:: Copy options
/S :: copy Subdirectories, but not empty ones.
/E :: copy subdirectories, including Empty ones.
/COPY:DAT :: what to COPY for files (default is /COPY:DAT).
/DCOPY:T :: COPY Directory Timestamps.
/PURGE :: delete dest files/dirs that no longer exist in source.
:: Retry Options
/R:0 :: number of Retries on failed copies: default 1 million.
/W:1 :: Wait time between retries: default is 30 seconds.
:: Logging Options (LOG+ append)
/NDL :: No Directory List - don't log directory names.
/NP :: No Progress - don't display percentage copied.
/TEE :: output to console window, as well as the log file.
/LOG+:c:\apps\commands\backup-robocopy-log.txt :: append to logfile
резервного копирования Robocopy-movemouse.bat
@echo off
@REM Move mouse to prevent maching from sleeping
@rem while running a backup script
echo Keep system awake while robocopy is running,
echo this script moves a mouse once in a while.
set basedir=%~dp0
set IDX=0
:LOOP
IF NOT EXIST "%basedir%backup-robocopy-lock.txt" GOTO :EOF
SET /A IDX=%IDX% + 1
IF "%IDX%"=="240" (
SET IDX=0
echo Move mouse to keep system awake
c:\apps\commands\nircmdc.exe sendmouse move 5 5
c:\apps\commands\nircmdc.exe sendmouse move -5 -5
)
c:\apps\commands\nircmdc.exe wait 1000
GOTO :LOOP
Ответ 3
Похоже, что опция /e
- это то, что вам нужно, она пропускает те же файлы/каталоги.
robocopy c:\data c:\backup /e
Если вы дважды запустите команду, вы увидите, что второй раунд намного быстрее, так как он пропускает много вещей.