Robocopy SKIP копирует существующие файлы по умолчанию?

Я где-то читал, что Robocopy по умолчанию пропускает копирование существующих файлов.

Но... я не могу найти переключатели командной строки для этого.

3 ответа

По умолчанию Robocopy пропускает копирование существующих файлов, если конкретные метаданные файлов совпадают, тогда эти файлы будут пропущены из операции копирования.

Как указано mklement0, подразумеваемое значение по умолчанию /COPY:DAT не будет копировать файлы с другими данными, если отметка времени [LastWriteTime] и размер файла одинаковы, и поэтому это пропуск по умолчанию.

Поэтому, если по какой-то причине у вас есть синхронизируемые два файла, которые имеют соответствующий размер файла, имя файла и последние измененные атрибуты, даже если данные отличаются, он не будет копировать исходный файл.

Опции Robocopy по умолчанию: /DCOPY:DA /COPY:DAT /R:3 /W:1


Robocopy или 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).
robocopy SOURCE DESTINATION FILE(S) /IS

куда IS расшифровывается как я включаю файлы S ame. Использование этого переключателя приводит к перезаписи существующих файлов. Увидеть ниже:

::
:: 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.
  • К сожалению, официальная документация не описывает логику того, какие файлы пропускаются по умолчанию.

  • Неофициальная документация ss64.com, тем не менее, содержит ключевой указатель (выделение добавлено):

    • По умолчанию Robocopy будет копировать файл только в том случае, если источник и место назначения имеют разные метки времени или разные размеры файлов.

Примечание: отметка времени относится к отметке времени последнего изменения (только).

Другими словами: Robocopy считает, что два файла одинаковы, основываясь только на том, идентичны ли их последние измененные метки времени и размеры файлов, и поэтому в этом случае копирование пропускается.

Из того, что я могу сказать:

  • На это поведение не влияет изменение аспектов файла / каталога для копирования (параметры /COPY / DCOPY)

    • Эти аргументы применяются только в том случае, если RoboCopy в основном считает, что данный файл / каталог нуждается в копировании, основываясь на логике одинаковости / включения.
  • Если вы хотите расширить обнаружение одинаковости по умолчанию (та же самая отметка времени последнего изменения и тот же размер файла) для следующих свойств, используйте /IT (Включить Tweaked) вариант:

    • атрибуты файла (представлены как A для параметра /COPY)
    • ACL (представлен как S для /COPY параметр)
    • владение файлом (представляется как O для /COPY параметр)
    • информация аудита (представлена ​​как U для /COPY параметр)
  • Кажется, что Robocopy не предлагает опцию обнаружения одинакового размера файлов на основе их содержимого (что обычно реализуется с помощью криптографической хеш-функции).
    Следовательно, в редких случаях, когда могут существовать файлы с одинаковыми отметками времени последнего изменения и одинаковыми размерами файлов, которые, тем не менее, различаются по содержанию, единственным вариантом является использование /IS (Включить то же самое):

    • Это приводит к тому, что файлы, которые считаются одинаковыми, будут скопированы безоговорочно - и, следовательно, потенциально излишне.

    • Предостережение: Любопытно, что файлы, которые одинаковы в отношении последнего измененного штампа и размера файла, но различаются в отношении свойств, упомянутых выше, по умолчанию не включаются с /IS в одиночестве; поэтому, чтобы покрыть все возможности, используйте /IS а также /IT комбинированный


Следующие тесты Пестера демонстрируют поведение; сохранить код как Tests.ps1 и вызвать его как 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
  }
}

Вы должны увидеть что-то вроде следующего, что означает, что все тесты пройдены (по состоянию на Robocopy.exe с версией файла 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
Другие вопросы по тегам