使用Robocopy仅复制更改的文件?

36

我正在寻找一种简单的方法,以便将仅更改过的文件部署到 Web 服务器上。过去我曾使用 MSBuild,它可以告诉我只复制目标上新的文件,但现在我很匆忙,不想费时间弄清楚 MSBuild 的更新版本。

我能用 ROBOCOPY 实现这一点吗?它有一个排除选项列表,如下:

  • /XC :: 排除改变的文件。
  • /XN :: 排除更新的文件。
  • /XO :: 排除旧的文件。
  • /XX :: 排除额外的文件和目录。
  • /XL :: 排除空闲的文件和目录。

排除具体意味着什么?是排除复制还是排除覆盖?例如,如果我写了:

ROBOCOPY C:\SourceFolder\ABC.dll D:\DestinationFolder /XO

这份复制会只复制更新的文件,而不是同龄的文件吗?

或者有更好的工具可以做到这一点吗?


1
嗯?关于MSBuild有什么需要理解的呢?如果你有一个可行的解决方案,使用更新版本就应该不会出问题了。 - Filburt
@Filburt:也许我想要一种快速而简单的方式来部署我的Web应用程序?从解决方案中似乎没有一种简单的方法可以部署到Web服务器。你想试着给出一个答案吗?你不必提供一个面向Robocopy的答案。 - Cyberherbalist
那么,为什么要给我点踩? - Cyberherbalist
我没有点踩,但我承认我曾经想过指出,在你发帖提问的时间里,你本可以自己尝试一下。 - Filburt
1
哦,@Filburt,我知道。我现在有六件不同的事情要做,在今晚回家之前必须完成所有这些事情。我只是试图使用StackOverflow作为我的助手,以节省一些时间。我也在寻找是否有我尚未了解的方法来完成这个任务。正如我所说,是否有更好的工具?我完全愿意使用任何快速的工具。也许我正在浪费我的时间。感谢您的回答。 - Cyberherbalist
4
下一次有人问关于Robocopy的问题,那么,@Filburt,答案将在这里。 - Cyberherbalist
3个回答

47

回答你的所有问题:

我能用ROBOCOPY完成这个吗?

是的,RC应该符合您的要求(简单性,仅复制所需内容)。


排除意味着什么?

排除意味着不复制- RC称之为跳过


使用/XO选项是否只会复制更新的文件,而不是同龄文件?

是的,RC仅会复制更新的文件。同龄文件将被跳过。

(正确的命令应该是robocopy C:\SourceFolder D:\DestinationFolder ABC.dll /XO


也许在您的情况下使用/MIR选项会有用。总体来说,RC更适用于目录和目录树,而不是单个文件。


2
您可以使用robocopy来复制带有归档标志并重置属性的文件。使用/M命令行,这是我的备份脚本,带有一些额外的技巧。
此脚本需要NirCmd工具以使鼠标移动,以便我的计算机不会进入睡眠状态。脚本正在使用锁定文件告诉何时完成备份脚本,并关闭mousemove.bat脚本。您可以省略此部分。
另一个工具是7-Zip,用于将小于4GB的虚拟盒文件拆分成较小的文件,我的目标文件夹仍然是FAT32,因此这是必需的。我应该使用NTFS磁盘,但尚未转换备份磁盘。

backup-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

backup-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

backup-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

-7
看起来你需要 /e 选项,它会跳过相同的文件/目录。
robocopy c:\data c:\backup /e

如果您运行该命令两次,您会发现第二轮运行速度更快,因为它跳过了很多步骤。

5
根据 https://www.computerhope.com/robocopy.htm 的说明,/e 参数仅负责“复制子目录,包括空目录”,没有提到跳过文件。 - Cribber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接