web-dev-qa-db-fra.com

Est-ce que Robocopy SKIP copie les fichiers existants par défaut?

J'ai lu (quelque part) que Robocopy ignore la copie des fichiers existants par défaut.

Mais ... je ne trouve pas de commutateur de ligne de commande pour cela.

7
Clay Nichols
robocopy SOURCE DESTINATION FILE(S) /IS

IS signifie I nclude S fichier ame ( s). L'utilisation de ce commutateur entraîne le remplacement des fichiers existants. Voir ci-dessous:

::
:: File Selection Options :
::
                 /A :: copy only files with the Archive attribute set.
                 /M :: copy only files with the Archive attribute and reset it.
    /IA:[RASHCNETO] :: Include only files with any of the given Attributes set.
    /XA:[RASHCNETO] :: eXclude files with any of the given Attributes set.

 /XF file [file]... :: eXclude Files matching given names/paths/wildcards.
 /XD dirs [dirs]... :: eXclude Directories matching given names/paths.

                /XC :: eXclude Changed files.
                /XN :: eXclude Newer files.
                /XO :: eXclude Older files.
                /XX :: eXclude eXtra files and directories.
                /XL :: eXclude Lonely files and directories.
                /IS :: Include Same files.
                /IT :: Include Tweaked files.
4
NetwOrchestration
  • Malheureusement, la documentation officielle ne décrit pas la logique derrièrequels fichiers sont ignorés par défaut.

  • La documentation non officielle de ss64.com , cependant, fournit le pointeur essentiel (accentuation ajoutée):

    • Par défaut, Robocopy ne copie un fichier que si la source et la destination ontdes horodatages différents ou des tailles de fichier différentes.

Remarque: horodatage fait référence au dernière modification horodatage(uniquement).

En d'autres termes:Robocopy considère que deux fichiers sont le identiques basés seulement si leurs horodatages modifiés en dernier lieu et la taille des fichiers sont identiques et par conséquent saute copier dans cet événement.

D'après ce que je peux dire:

  • Ce comportement est not affecté par la modification des aspects d’un fichier/répertoire en copy (paramètres /COPY/DCOPY).

    • Ces arguments ne sont appliqués que si / RoboCopy a fondamentalement jugé qu'un fichier/répertoire donné nécessitait une copie, en fonction de la logique de similitude/inclusion.
  • Si vous souhaitez étendre la détection de similitude par défaut(même horodatage modifié en dernier et même taille de fichier) aux propriétéssuivantes, utilisez le/IT ( Include Tweaked )option:

    • attributs de fichier (représentés par A pour le paramètre/COPY)
    • ACL (représentée par S pour le paramètre /COPY)
    • propriété du fichier (représentée par O pour le paramètre /COPY)
    • informations d'audit (représentées par U pour le paramètre /COPY)
  • Robocopy semble proposer des options no pour détecter la similitude des fichiers en fonction de leur contenu (qui est généralement implémenté via un fonction de hachage cryptographique ).
    Par conséquent, dansévénement rare, il pourrait y avoirdes fichiers avec des horodatages de dernière modification identiques et des tailles de fichier identiques qui diffèrent néanmoins par content , votre seule option est d'utiliser l'option/IS ( Include Same ):

    • Cela entraîne la copie des fichiers considérés comme identiques inconditionnellement - et donc potentiellement inutilement.

    • Caveat: Curieusement, les fichiers identiques par rapport à la dernière modification de tampon et à la taille du fichier mais diffèrent par rapport aux propriétés mentionnées ci-dessus are not inclus par défaut avec /IS seul; Par conséquent,pour couvrir toutes les éventualités, utilisez /IS et /IT combiné .


Les tests suivants de Pester démontrent les comportements; enregistrez le code en tant que Tests.ps1 et appelez-le en tant que Invoke-Pester ./Tests.ps1:

Describe RoboCopySkippedFilesTests {
  BeforeAll {
    Push-Location TestDrive:
  }
  AfterAll {
    Pop-Location
  }
  BeforeEach {
    # Set up a source and a destination folder and make their
    # Content the same.
    if (Test-Path dest) { Remove-Item -Force -Recurse dest }
    $null = New-Item -Type Directory -Force src
    'file1' > src\file1
    'file2' > src\file2
    Copy-Item -Recurse src dest
  }

  It "Does not copy anything with identical folders." {
    robocopy.exe src dest
    $LASTEXITCODE | Should Be 0
  }
  It "Does recognize a changed last-modified filestamp" {
    (gi src\file1).LastWriteTime = [datetime]::now
    robocopy.exe src dest # | Out-Host
    $LASTEXITCODE | Should Be 1
  }
  It "Does recognize a change in file size" {
    '!' | Add-Content dest\file1
    robocopy.exe src dest # | Out-Host
    $LASTEXITCODE | Should Be 1
  }
  It "Does not recognize a change in file content, with size and last-modified date identical" {
    'file!' > dest\file1
    (Get-Item dest\file1).LastWriteTime = (Get-Item src\file1).LastWriteTime
    robocopy.exe src dest # | Out-Host
    $LASTEXITCODE | Should Be 0
  }
  It "Does not recognize a change in file attributes, with size and last-modified date identical" {
    (Get-Item dest\file1).Attributes = 'System'
    robocopy.exe src dest # | Out-Host
    $LASTEXITCODE | Should Be 0
  }
  It "Does recognize an attribute-modified-only file as tweaked (/IT)" {
    (Get-Item dest\file1).Attributes = 'System'
    robocopy.exe src dest /IT # | Out-Host
    $LASTEXITCODE | Should Be 1
  }
  It "Does not include an attribute-modified-only file with /IS" {
    Remove-Item src\file2, dest\file2
    (Get-Item dest\file1).Attributes = 'System'
    robocopy.exe src dest /IS # | Out-Host
    $LASTEXITCODE | Should Be 0
  }
}

Vous devriez voir quelque chose comme ce qui suit, indiquant que tous les tests ont été réussis (à partir de Robocopy.exe avec la version de fichier 10.0.16299.15 (WinBuild.160101.0800)):

Describing RoboCopySkippedFilesTests
 [+] Does not copy anything with identical folders. 231ms
 [+] Does recognize a changed last-modified filestamp 112ms
 [+] Does recognize a change in file size 68ms
 [+] Does not recognize a change in file content, with size and last-modified date identical 69ms
 [+] Does not recognize a change in file attributes, with size and last-modified date identical 83ms
 [+] Does recognize an attribute-modified-only file as tweaked (/IT) 65ms
 [+] Does not include an attribute-modified-only file with /IS 70ms
Tests completed in 589ms
Passed: 7 Failed: 0 Skipped: 0 Pending: 0 Inconclusive: 0
1
mklement0

Par défaut, Robocopy ignore la copie des fichiers existants si les métadonnées spécifiques des fichiers correspondent, puis ces fichiers seront ignorés lors de la copie.

Comme indiqué par @ mklement0 , la valeur implicite par défaut /COPY:DAT ne copie pas les fichiers contenant des données différentes si l'horodatage [LastWriteTime] et la taille du fichier sont identiques et c'est donc un saut par défaut.

Ainsi, si, pour une raison quelconque, vous synchronisez deux fichiers dont la taille, le nom de fichier et les derniers attributs modifiés sont identiques, même si les données sont différentes, le fichier source ne sera pas copié.

Robocopy Options par défaut: /DCOPY:DA /COPY:DAT /R:3 /W:1


Robocopy ou Robocopy /?

 /COPY:copyflag[s] : What to COPY (default is /COPY:DAT)
                      (copyflags : D=Data, A=Attributes, T=Timestamps
                       S=Security=NTFS ACLs, O=Owner info, U=aUditing info).
1
Pimp Juice IT