copiar archivos solo cuando no existen en el destino

0

Quiero copiar muchos archivos en muchas carpetas de un disco duro A a otro disco duro B.

¿Cómo puedo copiar solo archivos de A a B y omitir la copia si los archivos ya existen en B?

¿Es esto posible con xcopy?

mrz
fuente
XCOPY no tiene esa opción ... use EXPLORER, puede omitir la sobrescritura de todos los duplicados.
Akina
Por carpeta puede usarReplace /A
LotPings del
@ Akina: Me gustaría saber cómo es el comando Shell.
mrz
1
use robocopy tiene tales opciones
Drako
1
Vale la pena aclarar lo que "ya existe en B". ¿Cuándo se considera lo mismo? ¿Nombre? ¿Talla? Suma de comprobación? Para mí tiene que ser una suma de comprobación, pero si el rendimiento es una preocupación real, esta podría no ser la "mejor" opción. Como ha etiquetado Powershell, puede usar Test-Path para ver simplemente si el archivo existe por ruta y, por lo tanto, por nombre, pero sugeriría que realmente quiera considerar la suma de comprobación del archivo. Por supuesto, para obtener la suma de comprobación, esto tendrá cierto impacto en el rendimiento solo con probar el nombre de archivo / ruta que no requiere abrir el archivo. Confirmar este es el primer paso que sugeriría.
HelpingHand

Respuestas:

1

Puede canalizar los resultados de un GCI recursivo de la fuente, probar si es una Carpeta o Archivo y luego usar este objeto para probar la ruta para verificar si está presente en la carpeta de destino.

algo como ...

   # Initial setup defaults
    $Start = Date # Uses this start time at the end to calculate how long the process took!
    $src = 'C:\Original Folder'
    $dest = 'D:\New Folder'

Get-ChildItem -Path $src -Recurse | 

           % {
             If ($_.PSIsContainer)
              { If (Test-Path (Join-Path (Join-Path $dest $_.Parent.FullName.SubString($src.Length)) $_.BaseName)){
                    }Else{
                        $_ | Copy-Item  -Destination {Join-Path $dest $_.Parent.FullName.Substring($src.length)} -Force #-Whatif
                    }
                }Else{
                    If (Test-Path (Join-Path $dest $_.FullName.SubString($src.Length))){ 
                    }Else{
                    $_ | Copy-Item  -Destination {Join-Path $dest $_.FullName.Substring($src.length)} -Force #-Whatif
              }
             }
            }  -ErrorAction Continue


    $End = Date
    $TimeDiff = New-TimeSpan $Start $End
    $Difference = "{0:G}" -f $TimeDiff

Write-Host " Scan time " $Difference " [(Days) Hours Minutes Seconds]"

Si la ruta de prueba en el archivo es exitosa pero tiene archivos con los mismos nombres pero con diferentes marcas de tiempo, entonces deberá implementar algún tipo de comparación entre archivos o verificar la última hora de escritura del archivo.

If ($_.LastWriteTime -gt ((Join-Path $dest $_.FullName.SubString($src.Length)).LastWriteTime)){ $_ | Copy-Item  -Destination {Join-Path $dest $_.FullName.Substring($src.length) }}
Antonio
fuente