合并目录而不覆盖冲突

合并目录而不覆盖冲突

我有 2 个目录结构(A 和 B),它们通常不会重叠。我想将 A 合并到 B 中。

以下命令将合并目录:

xcopy A B /E /Y

但是,我希望能够检测我的两个目录之间的冲突,并且如果文件已经在目标位置(在 B 中),则不要覆盖。xcopy 将自动覆盖文件。我不想每次发生冲突时都提示我(/y)。我希望 xcopy 在发生冲突时返回错误。

/D 选项也不起作用,因为我不关心日期。

我猜 xcopy 无法实现这一点。还有其他解决方案吗?

答案1

您可以使用 ROBOCOPY 命令移动所有不与目标中现有文件冲突的文件。我添加了/L列出结果的选项,但实际上不执行任何操作。如果它按预期工作,则只需删除/L实际移动文件的选项即可。

robocopy sourcePath destinationPath /mov /xc /xn /xo /xx /L

ROBOCOPY 命令会生成一份详细的日志,记录它执行的所有操作。使用上述命令,您可以通过查看Files :...摘要中的行来检测文件是否因冲突而未移动。如果复制的数量小于总数,则存在冲突。

ROBOCOPY 命令具有许多选项使其非常强大。在命令提示符下键入HELP ROBOCOPY或以获取更多信息。ROBOCOPY HELP

答案2

创建一个文件,例如 dummy.txt ,其中包含许多行,N如下所示

N
N
N
N
N

称呼XCOPY A B /E /-Y <dummy.txt >output.txt

输出文件中任何包含问题的行都是未被覆盖的冲突文件。

答案3

此脚本使用 powershell 将 2 个目录合并在一起。它仅对源文件夹执行操作,而不对目标文件夹执行操作。如果文件不存在,它将移动该文件;如果文件哈希匹配,它将删除该文件。如果名称相同但文件哈希不同,它将跳过该文件。此脚本 90% 是使用 ChatGPT 制作的。

param (
   [string]$srcDir,
   [string]$dstDir
)

$VerbosePreference = "Continue"
#Write-Verbose "Source $srcDir"
#Write-Verbose "Dest $dstDir"

$files = Get-ChildItem -Path $srcDir -Recurse -File

foreach ($file in $files) {
   $srcFile = $file.FullName
   $dstFile = $srcFile -replace [regex]::Escape($srcDir), $dstDir
   Write-Verbose "Checking $srcFile"
   #Write-Verbose "DstDir after regex $dstDir"
   $dstDirNew = Split-Path $dstFile -Parent
   #Write-Verbose "DstDir after split path $dstDirNew"

   # Create the destination directory if it does not exist
   if (!(Test-Path $dstDirNew)) {
      New-Item -ItemType Directory -Path $dstDirNew | Out-Null
   }

   # Check if the file exists in the destination directory
   if (Test-Path $dstFile) {
      # Calculate hash of the source file
      $srcHash = Get-FileHash -Path $srcFile

      # Calculate hash of the destination file
      $dstHash = Get-FileHash -Path $dstFile

      # Compare hashes
      if ($srcHash.Hash -eq $dstHash.Hash) {
         # Hashes are the same, delete the source file
         Write-Verbose "Deleting"
         Remove-Item -Path $srcFile -Force
      } else {
         Write-Verbose "Skipping (hashes do not match)"
      }
   } else {
      # File does not exist in the destination directory, move it
      Write-Verbose "Moving to: $dstDir"
      Move-Item -Path $srcFile -Destination $dstDirNew -Force
   }
}

相关内容