我有 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
}
}