O Robocopy SKIP copia os arquivos existentes por padrão?

5

Eu leio (em algum lugar) que o Robocopy pula a cópia de arquivos existentes por padrão .

Mas ... não consigo encontrar nenhuma linha de comando muda para isso.

    
por Clay Nichols 17.08.2016 / 03:32

3 respostas

3

robocopy SOURCE DESTINATION FILE(S) /IS

Em que IS significa I nclude S arquivo (s) ame. Usar essa opção faz com que os arquivos existentes sejam substituídos. Veja abaixo:

::
:: 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.
    
por 17.08.2016 / 03:45
1

Por padrão, o Robocopy ignora a cópia de arquivos existentes se os metadados específicos dos arquivos corresponderem e, em seguida, esses arquivos serão ignorados da operação de cópia.

Conforme indicado por @ mklement0 , o padrão implícito /COPY:DAT não copiará arquivos com dados diferentes se o registro de data e hora [LastWriteTime] e o tamanho do arquivo é o mesmo e, portanto, este é um salto padrão.

Portanto, se por algum motivo você tiver dois arquivos sincronizados com tamanho de arquivo, nome de arquivo e atributos modificados pela última vez, mesmo que os dados sejam diferentes, ele não copiará o arquivo de origem.

Robocopy Default Options: /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).
    
por 17.08.2016 / 03:40
0
  • Infelizmente, a documentação oficial não descreva a lógica por trás do quais arquivos são ignorados por padrão .

  • A documentação não oficial ss64.com , no entanto, fornece o ponteiro crucial (ênfase adicionada):

    • By default Robocopy will only copy a file if the source and destination have different time stamps or different file sizes.

Observação: registro de data e hora refere-se ao registro de data e hora da última modificação (somente).

Em outras palavras: Robocopy considera dois arquivos como sendo o mesmo baseado apenas sobre se seus timestamps e tamanhos de arquivo da última modificação são idênticos e, portanto, < em> ignora a cópia nesse evento.

Pelo que posso dizer:

  • Esse comportamento não é afetado pela modificação dos aspectos de um arquivo / diretório para copiar (parâmetros /COPY / DCOPY )

    • Esses argumentos só são aplicados se o RoboCopy tiver considerado fundamentalmente um determinado arquivo / diretório que precisa ser copiado, com base na lógica de igualdade / inclusão.
  • Se você quiser estender a detecção de amostragem padrão (mesmo registro de data e hora da última modificação e mesmo tamanho de arquivo) para as propriedades a seguir , use a opção /IT ( Incluir Tweaked ) :

    • atributos de arquivo (representados como A para o parâmetro / COPY)
    • ACL (representado como S para o parâmetro /COPY )
    • propriedade de arquivo (representada como O para o parâmetro /COPY )
    • informações de auditoria (representadas como U para o parâmetro /COPY )
  • Robocopy parece oferecer não opção para detectar a mesmice dos arquivos com base em seu conteúdo (que é tipicamente implementado via a função hash criptográfica ).
    Portanto, no evento raro , pode haver arquivos com registros de data e hora idênticos da última modificação e tamanhos de arquivo idênticos que, no entanto, diferem no conteúdo . A única opção é usar a opção /IS ( Incluir o mesmo ) :

    • Isso faz com que os arquivos considerados iguais sejam copiados incondicionalmente - e, portanto, potencialmente desnecessários.

    • Advertência : Curiosamente, os arquivos que são os mesmos em relação ao carimbo de arquivo e tamanho de arquivo da última modificação são diferentes em relação às propriedades mencionadas acima são não incluído por padrão com /IS sozinho; portanto, para cobrir todas as eventualidades, use /IS e /IT combinados .

Os seguintes testes Pester demonstram os comportamentos; salve o código como Tests.ps1 e invoque-o como 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
  }
}

Você deve ver algo como o seguinte, indicando que todos os testes foram aprovados (a partir de Robocopy.exe com a versão do arquivo 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
    
por 09.08.2018 / 00:18