仅将较新的文件从一个文件夹复制到另一个文件夹

lio*_*tal 9 windows xcopy cmd.exe

我有 2 个包含文件的文件夹。这些文件是某些构建过程的产物。第一个文件夹是先前构建的输出,而后者是当前构建的输出。

我想以某种方式从命令行/构建脚本中区分这两个文件夹,并仅将添加的文件或新文件复制到其他文件夹中。

例如:

**FOLDER1** (new build)
a.txt
b.txt (modified)
c.txt
d.txt

**FOLDER2** (prev build)
a.txt
b.txt
c.txt
Run Code Online (Sandbox Code Playgroud)

基于此,我感兴趣的复制操作将仅将 b.txt 和 d.txt 复制到其他文件夹中(而不是文件夹 2 中)。

基本上,我只是在“增量”之后,我想将这些存储在某个地方。

这是否可以使用 Windows 附带的标准命令行工具?(假设 Windows 7/Server 2008 或更高版本)

dbe*_*ham 11

使用带有 /D 和 /L 选项的 XCOPY,从文件夹 1“复制”到文件夹 2。

/D 选项将副本限制为仅新文件或修改过的文件。

/L 选项使命令列出将被复制的文件,但阻止实际制作任何副本。

然后使用 FOR /F 处理这些结果并将文件实际复制到文件夹 3。

for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul
Run Code Online (Sandbox Code Playgroud)

如果放在批处理文件中,则所有文件都%必须加倍为%%.

XCOPY 还打印出有多少文件受到(将)影响的摘要。以上将尝试复制摘要计数为“name”的文件,当然会失败。将输出重定向到 nul 可防止显示错误消息。我在 Windows 7 上进行了测试,很惊讶错误消息出现在 stdout 而不是 stderr。如果其他版本的错误信息出现在 stderr 上,那么该命令也应该得到 2>nul 以防止出现错误信息。

但是隐藏错误消息存在风险 - 如果副本由于某种原因失败怎么办?

这是一个脚本,它将列出所有成功复制的文件,并指出哪些(如果有)失败。它使用 FINDSTR 过滤掉不需要的文件数。它假设文件计数是英文的,格式为NNN File(s),因此必须针对其他语言进行修改。

@echo off
for /f "eol=: delims=" %%F in (
  'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"
Run Code Online (Sandbox Code Playgroud)

这是一个适用于任何语言的更复杂的变体。它将每个文件名保存到一个变量中,并将复制延迟到下一次循环迭代。最后一个条目(计数)永远不会被复制。

@echo off
setlocal disableDelayedExpansion
set "file="
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
  if defined file (
    setlocal enableDelayedExpansion
    copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"
    endlocal
  )
  set "file=%%F"
)
Run Code Online (Sandbox Code Playgroud)


小智 5

我更喜欢 ROBOCOPY。使用 XCOPY 多年,然后发现需要通过缓慢/不稳定的互联网连接进行可重新启动的复制操作。

ROBOCOPY src dest /s /e /xo

或镜子

ROBOCOPY src dest /mir

使用“日志记录”选项获取您的列表以供稍后检查。

ROBOCOPY src dest /s /e /xo /log:文件