【问题标题】:Use Robocopy to copy only changed files?使用 Robocopy 仅复制更改的文件?
【发布时间】:2014-06-11 18:47:01
【问题描述】:

我正在尝试找到一种简单的方法,仅将更改的文件部署到网络服务器以进行部署。过去我使用过 MSBuild,它可能被告知只复制比目标上的文件新的文件,但我很着急,不想尝试找出更新版本的 MSBuild。

我可以为此使用 ROBOCOPY 吗?有一个排除选项列表,即:

  • /XC :: 排除更改的文件。
  • /XN :: 排除较新的文件。
  • /XO :: 排除旧文件。
  • /XX :: 排除 eXtra 文件和目录。
  • /XL :: 排除 Lonely 文件和目录。

排除究竟是什么意思?排除复制,还是排除覆盖?例如,如果我写:

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

这只会复制较新的文件,而不是相同年龄的文件吗?

或者有没有更好的工具来做到这一点?

【问题讨论】:

  • 嗯?关于 MSBuild,有什么要弄清楚的?如果你有一个可行的解决方案,你应该对 newer 版本很好。
  • @Filburt:也许我想要一种快速而肮脏的方式来部署我的网络应用程序?似乎没有一种简单的方法可以从解决方案部署到 Web 服务器。想尝试找出答案吗?您不必提供面向 Robocopy 的答案。
  • 那么,反对票是怎么回事?
  • 哦,@Filburt,我知道。我目前有六件不同的事情要做,都必须在今晚回家之前完成。我只是想使用 StackOverflow 作为我的 gofer,以节省我一些时间。我还想看看是否有一种我还不知道的方法来做到这一点。正如我所指出的,有没有更好的工具?我非常愿意使用任何会很快的东西。也许我在滥用我的时间。谢谢你的回答。
  • 但是下次有人对 Robocopy 有疑问时,好吧,猜猜看,@Filburt,答案就在这里。

标签: command-line synchronization command-line-arguments robocopy


【解决方案1】:

回答你所有的问题:

我可以为此使用 ROBOCOPY 吗?

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


排除到底是什么意思?

它将排除复制 - RC 称之为 skipping


/XO 选项会只复制较新的文件,而不是相同年龄的文件吗?

是的,RC 只会复制较新的文件。相同年龄的文件将被跳过。

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


在您的情况下,使用 /MIR 选项可能会很有用。一般来说,RC 的目标是目录和目录树,而不是单个文件。

【讨论】:

    【解决方案2】:

    您可以使用 robocopy 复制带有存档标志的文件并重置属性。使用 /M 命令行,这是我的备份脚本,有一些额外的技巧。

    这个脚本需要NirCmd 工具来保持鼠标移动,这样我的机器就不会进入睡眠状态。脚本使用锁定文件来告知备份脚本何时完成以及 mousemove.bat 脚本何时关闭。这部分可以省略。

    另一个是7-Zip 用于拆分小于 4GB 文件的 virtualbox 文件的工具,我的目标文件夹仍然是 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
    

    【讨论】:

      【解决方案3】:

      看起来/e 选项是您所需要的,它会跳过相同的文件/目录。

      robocopy c:\data c:\backup /e
      

      如果你运行该命令两次,你会发现第二轮的速度要快得多,因为它跳过了很多东西。

      【讨论】:

      • 根据:computerhope.com/robocopy.htm> /e 只负责“复制子目录,包括空的子目录”。跳过文件没有任何意义。
      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多