复制文件而不会覆盖


99

我只是似乎在命令行上找不到说“将目录A中的所有文件复制到目录B中的方法,但是如果该文件已存在于目录B中,那么无论哪个文件是较新的都不要覆盖它,不要提示我。”

我已经完成了复制,移动,xcopy和robocopy的工作,而我能得到的最接近的结果是,您可以告诉robocopy“将A复制到B,但不要用较旧的文件覆盖较新的文件”,但这对我不起作用。我查看了xxcopy,但将其丢弃了,因为我不希望第三方依赖Visual Studio生成后事件,该事件将要求其他SVN用户安装该工具才能进行生成。

我想在Visual Studio 2010中的构建后事件中添加命令行,以便从新EF模型对象的T4模板生成的文件被分发到它们所属的项目文件夹中,但为现有对象重新生成文件不要覆盖可能已编辑的目标文件。

由于T4模板会重新生成,因此源文件始终是较新的,并且我认为我不能可靠地使用“较新”的开关。

我为那些可以使用的项目使用了部分类,但是我生成的其他一些东西却不能使用部分类(例如,生成默认的EditorTemplate或DisplayTemplate * .ascx文件)。

任何人都有解决的类似问题吗?


您熟悉cmd.exefor命令吗?如果没有,我建议您运行for /?并使用它。
加布

Answers:


38
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"

5
这对我有用,但是我必须使用两个百分号而不是一个百分号,因为我是从批处理文件而不是命令行中运行它。我将%F的实例替换为%% F,将%〜nxF的实例替换为%%〜nxF。
欧文

1
是什么~nx%~nxF究竟意味着什么呢?
Serge Rogatch

@stu,它只表示~nxF该变量F变为文件名和扩展名。
Serge Rogatch '16

是的,非常有效,给我文件名+扩展名,不带路径-这是您需要在目标文件夹中进行测试并指定目标文件名的步骤。关键是%F包含路径,而您不希望在此路径。
斯图

207

的Robocopy或者“强大的文件复制”,是一个命令行目录复制命令。从Windows NT 4.0开始,它已作为Windows资源工具包的一部分提供,并作为Windows Vista,Windows 7和Windows Server 2008的标准功能引入。

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

详细说明(使用Hydrargyrum,HailGallaxar和Andy Schmidt答案):

  • /E 使Robocopy递归地复制子目录,包括空目录。
  • /XC排除具有相同时间戳但文件大小不同的现有文件。Robocopy通常会覆盖这些内容。
  • /XN排除比目标目录中的副本新的现有文件。Robocopy通常会覆盖这些内容。
  • /XO排除比目标目录中的副本早的现有文件。Robocopy通常会覆盖这些内容。

排除了Changed,Older和Newer类之后,Robocopy可以完全满足原始发布者的要求-无需加载脚本环境。

参考:TechnetWikipedia
下载来自:Microsoft下载链接 (链接最后验证于2016年3月30日)


“排除”是指“跳过”还是“删除/删除”?
空袭

@Andre Terra:通常跳过。如果您使用/ MIR标志,则可能会将其删除。我还没有测试过。
Hydrargyrum 2013年

使用/ MIR,确实删除了源中不存在的文件。但是,当同时使用/ XN和/ XO时,两个地方都存在的文件将被跳过(不确定是否检查了大小)。这是我需要复制较新或较旧版本的应用程序但应用程序使用的库的dateModified戳记不正确而文件名本身包含其版本号的情况的理想选择。
Henno Vermeulen 2015年

是否需要包含/e?如果/s改用该怎么办?我不要一堆空的子文件夹。
Arete

48

贝利萨留的解决方案很好。

要详细说明这个简短的答案:

  • /E 使Robocopy递归地复制子目录,包括空目录。
  • /XC排除具有相同时间戳但文件大小不同的现有文件。Robocopy通常会覆盖这些内容。
  • /XN排除比源目录中的副本新的现有文件。Robocopy通常会覆盖这些内容。
  • /XO排除比源目录中的副本早的现有文件。Robocopy通常会覆盖这些内容。

排除了Changed,Older和Newer类之后,Robocopy可以完全满足原始发布者的要求-无需加载脚本环境。


46

您可以尝试以下方法:

echo n | copy /-y <SOURCE> <DESTINATION>

-y只需在覆盖之前提示即可,我们可以将n传递给所有这些问题。因此,从本质上讲,这将仅复制不存在的文件。:)


2
非常简单。
Holf's

6
当我们只管道一次时,为什么回答所有问题?
phuclv

太棒了,我选择了这个选项。在考虑管道之前,我先搜索了一个我以为自己缺少的参数,然后浏览了此页面。尝试此解决方案时,我注意到在管道传输时,复制显然启用了/ Y参数,因此这就是必须添加/ -Y的原因。
安德鲁

2
@phuclv似乎copy /-y一旦stdin用完输入就会自动假定No。您可以省略第一个显式n,或< nul将其插入其中,然后发生同样的事情。
mwfearnley

6

这是批处理文件形式:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"

3

我只想澄清一下我自己的测试中的一些内容。

@Hydrargyrum写道:

  • / XN排除比源目录中的副本新的现有文件。Robocopy通常会覆盖这些内容。
  • / XO排除比源目录中的副本早的现有文件。Robocopy通常会覆盖这些内容。

这实际上是倒退。XN会“排除较新的”文件,但会排除比目标目录中的副本新的文件。XO会“排除旧版本”,但会排除目标目录中的副本之前的文件。

当然,您可以像往常一样进行自己的测试。


1
这是对原始问题的答案,还是对其他人的答案的评论?
ASGM 2013年

1
Hydrargyrum的答案在撰写原始问题的答案或对其他人的答案发表评论时具有+25票?
莫。

3

xcopy有一种奇怪的方法:

echo nnnnnnnnnnn | xcopy /-y source target

只需包含与要复制的文件一样多的n,它就会回答所有覆盖问题。


关于copy,请参阅此答案,特别是@mwfearnley注释:一旦stdin用尽,它就会copy /-y自动假设n,因此您echo n只能执行一次,但仍然可以使用。
rsenna

3
robocopy src dst /MIR /XX

/ XX:排除“ eXtra”文件和目录(存在于目标位置而不是源位置)。这样可以防止从目的地删除任何内容。(这是默认设置)


1

对于尚未安装Robocopy的系统,可以在此处下载Robocopy。(即Windows Server2003。)

http://www.microsoft.com/download/zh-cn/details.aspx?displaylang=zh-CN&id=17657 (安装无需重新启动)

请记住将您的路径设置为robocopy exe。您可以通过右键单击“我的电脑”>“属性”>“高级”>“环境变量”来执行此操作,然后找到路径系统变量并将其添加到末尾:“; C:\ Program Files \ Windows Resource Kits \ Tools”或任何地方安装了它。确保保留已经存在的路径变量字符串,然后追加附加路径。

设置路径后,您可以运行belisarius建议的命令。效果很好。


1

它不会让我直接对不正确的消息发表评论,而是要警告所有人,与以前的消息中发布的内容相比,/ XN和/ XO选项的定义已被反转。

排除旧文件/较新文件选项与RoboCopy日志中显示的信息一致:RoboCopy将遍历SOURCE,然后报告SOURCE中的每个文件是否比目标文件“旧”还是“新”。

因此,/ XO将排除OLDER SOURCE文件(直观),而不是“比源文件早”的文件。

如果只想复制新的或更改的源文件,而又避免替换较新的目标文件,则/ XO是正确的选择。


0

一种简单的方法是使用/ MIR选项来镜像两个目录。基本上,它将仅将新文件复制到目标位置。在下一个命令中,将源和目标替换为文件夹的路径,脚本将搜索具有任何扩展名的任何文件。

robocopy <source directory> <destination directory> *.* /MIR

0

这就是对我有用的东西。我用它来“添加”文件到另一个驱动器上,而不会被覆盖。

批处理文件: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\

在实施之前进行测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.