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