复制文件而不覆盖
我似乎无法在命令行上find一种方法来说“将所有文件从目录A复制到目录B,但是如果目录B中已经存在该文件,请不要覆盖它,不pipe哪个文件更新,不要提示我。“
我已经通过复制,移动,xcopy和robocopy,而且我能得到的最接近的是,你可以告诉robocopy“复制A到B,但不要用较旧的文件覆盖较新的文件”,但这对我不起作用。 我查看了xxcopy,但放弃了它,因为我不想在Visual Studio后构build事件上有第三方依赖关系,这将需要其他SVN用户安装该工具才能进行构build。
我想将一个命令行添加到Visual Studio 2010中的生成后事件中,以便从新的EF模型对象的T4模板生成的文件被分发到它们所属的项目文件夹,但为现有对象生成了重新生成的文件不要覆盖潜在编辑的目标文件。
由于T4模板重新生成,源文件总是更新,我不能可靠地使用“更新”的开关,我不这么认为。
我使用部分类为我可以,但也有我不能使用部分类(例如生成一个默认的EditorTemplate或DisplayTemplate * .ascx文件)生成的其他事情。
任何人有任何类似的问题,他们已经解决了?
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
Robocopy 或“可靠的文件复制”是命令行目录复制命令。 它已经作为从Windows NT 4.0开始的Windows资源工具包的一部分提供,并作为Windows Vista,Windows 7和Windows Server 2008的标准function被引入。
robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO
详细说明(使用Hydrargyrum,HailGallaxar和Andy Schmidt的答案):
-
/E
使Robocopyrecursion复制子目录,包括空的。 -
/XC
排除具有相同时间戳但文件大小不同的现有文件。 Robocopy通常覆盖这些。 -
/XN
排除比目标目录中的副本更新的现有文件。 Robocopy通常覆盖这些。 -
/XO
排除比目标目录中的副本旧的现有文件。 Robocopy通常覆盖这些。
随着更改,更旧和更新的课程被排除,Robocopy完全按照原始的海报要求 – 无需加载脚本环境。
参考文献: Technet , 维基百科
从下载: Microsoft下载链接 (链接上次validation2016年3月30日)
Belisarius的解决scheme是好的。
为了详细说明这个稍微简洁的答案:
-
/E
使Robocopyrecursion复制子目录,包括空的。 -
/XC
排除具有相同时间戳但文件大小不同的现有文件。 Robocopy通常覆盖这些。 -
/XN
排除比源目录中的副本更新的现有文件。 Robocopy通常覆盖这些。 -
/XO
排除比源目录中的副本更早的现有文件。 Robocopy通常覆盖这些。
随着更改,更旧和更新的课程被排除,Robocopy完全按照原始的海报要求 – 无需加载脚本环境。
你可以试试这个:
echo n | copy /-y <SOURCE> <DESTINATION>
只是在覆盖之前提示,我们可以向所有这些问题提出build议。 所以这实质上就是复制不存在的文件。 🙂
这里是batch file格式:
@echo off set source=%1 set dest=%2 for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
我只是想从我自己的testing中澄清一些事情。
@Hydrargyrum写道:
- / XN排除比源目录中的副本更新的现有文件。 Robocopy通常覆盖这些。
- / XO排除比源目录中的副本旧的现有文件。 Robocopy通常覆盖这些。
这实际上是倒退。 XN会“排除较新的”文件,但会排除比目标目录中的副本更新的文件。 XO确实“排除旧的”,但排除比目的地目录中的副本更早的文件。
当然,一如既往地做你自己的testing。
有一个奇怪的方式来做到这一点与xcopy:
echo nnnnnnnnnnn | xcopy /-y source target
只要包含你正在复制的n个文件,它就会对所有覆盖问题回答n。
robocopy src dst /MIR /XX
/ XX:排除“eXtra”文件和目录(目的地但不是来源)。 这将防止从目的地的任何删除。 (这是默认)
Robocopy可以从这里下载到没有安装的系统。 (即Windows Server 2003)。
http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (安装时不需要重新启动)
请记住将您的path设置为robocopy exe。 通过右键单击“我的电脑”>属性>高级>“环境variables”,然后findpath系统variables并将其添加到最后:“; C:\ Program Files \ Windows资源工具包\工具”或无论您身在何处安装它。 确保保留已经存在的pathvariablesstring,然后添加addtionalpath。
一旦path被设置,你可以运行belisariusbuild议的命令。 它工作很好。
它不会让我直接对不正确的消息发表评论 – 但让我只是警告大家,与之前的消息中发布的内容相比,/ XN和/ XO选项的定义是REVERSED。
“排除旧文件/新文件”选项与RoboCopylogging中显示的信息一致:RoboCopy将遍历SOURCE,然后报告源文件中的每个文件是否比目标文件中的“OLDER”或“NEWER”更新。
因此,/ XO将排除OLDER SOURCE文件(这是直观的),而不是像这里所声称的那样“比源代码更老”。
如果您只想复制新的或更改的源文件,但是避免replace更新的目标文件,那么/ XO是正确的选项。
一个简单的方法是使用/ MIR选项来镜像这两个目录。 基本上它只会将新文件复制到目的地。 在下一个命令中,将源文件和目标文件replace为文件夹的path,脚本将search任何具有扩展名的文件。
robocopy <source directory> <destination directory> *.* /MIR
这是为我工作的。 我用这个“添加”到另一个驱动器的文件,没有覆盖。
batch file: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\
在实施之前做testing。