По умолчанию rsync
не удаляет файлы на стороне назначения. Чтобы сделать rsync
удалить файлы вообще, необходимо использовать по крайней мере одну из опций удаления.
Если вас не волнует, когда файлы удаляются, просто используйте --delete
и оставьте выбор rsync
. Вы можете комбинировать --delete
с другими опциями удаления (это не конфликтует), но вам не нужно, так как все другие опции удаления уже подразумевают --delete
.
--delete-before
работает следующим образом: rsync
смотрит, какие файлы присутствуют в исходном коде, а какие - в целевом, удаляет все файлы, найденные в целевом коде, но не в исходном коде, а затем начинает фактическую синхронизацию. Этот порядок полезен, если у адресата мало места на диске, так как сначала он освободит больше дискового пространства в месте назначения, прежде чем начать передачу новых файлов. Недостатком является то, что rsync
потребует больше памяти для выполнения операции, а вся операция является двухступенчатым процессом и, следовательно, более медленным.
--delete-during
работает следующим образом: rsync
сразу же начинает синхронизировать файлы, и когда он сталкивается с файлом, который существует только в месте назначения, он удаляется. Таким образом, отсутствует штраф за превышение скорости, а также не требуется дополнительная память. Недостатком является то, что может случиться так, что сначала много новых файлов будет скопировано в пункт назначения, прежде чем удаленные файлы будут удалены, поэтому пункт назначения может потребовать гораздо больше дискового пространства во время выполнения операции, чем требуется в конце, после того, как вся операция будет выполнена.
--delete-after
работает следующим образом: Сначала синхронизируйте все файлы, затем выполните ту же операцию, что и --delete-before
перед фазой синхронизации. Это самый худший выбор в наиболее распространенных случаях, так как он требует большую часть памяти, большую часть дискового пространства в месте назначения, и он медленнее, так как является двухступенчатым процессом; в основном, он сочетает в себе все недостатки двух других методов. Этот вариант в основном существует для случая, когда вы используете “merge files” (что такое файлы слияния и как они работают, выходит за рамки этого ответа). Поскольку эти файлы могут содержать правила для файлов, которые должны быть исключены при удалении, новые объединенные файлы должны быть скопированы перед фазой удаления, если их содержание должно быть учтено на фазе удаления. Если это не является требованием, то --delete-after
не имеет никакого преимущества.
--delete-delay
- это довольно новая опция (она недоступна в rsync
2.6.9, которая, например, все еще является опцией по умолчанию в macOS 10.15). Она работает как --delete-during
, за исключением того, что она не удаляет файлы сразу, а после завершения синхронизации, поэтому она является гибридом --delete-during
и --delete-after
. Преимущество в том, что она работает быстрее, чем --delete-after
, а недостаток в том, что во время синхронизации требуется больше памяти.
--delete-excluded
говорит rsync
не только удалять файлы, отсутствующие в исходном коде, но и удалять файлы по назначению, которые были исключены из синхронизации (--exclude
или --exclude-from
), независимо от того, будут ли эти файлы на самом деле существовать в исходном коде или нет.