Команда копирования или rsync - PullRequest
69 голосов
/ 14 июня 2011

Следующая команда работает должным образом ...

cp -ur /home/abc/* /mnt/windowsabc/

Имеет ли rsync какое-либо преимущество перед ней?Есть ли лучший способ синхронизировать папку резервного копирования каждые 24 часа?

Ответы [ 8 ]

52 голосов
/ 14 июня 2011

Rsync лучше, поскольку он будет копировать только обновленные части обновленного файла, а не весь файл. Он также использует сжатие и шифрование, если хотите. Проверьте это учебник .

50 голосов
/ 02 января 2012

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

В очень большой файловой системе (скажем, многие тысячи или миллионы файлов)там, где файлы, как правило, добавляются, но не обновляются, «cp -u», вероятно, будет более эффективным.cp принимает решение копировать исключительно по метаданным и может просто заняться копированием.

Обратите внимание, что вам может потребоваться некоторая буферизация, например, с использованием tar вместо простого cp, в зависимости от размера файлов,производительность сети, другие операции с диском и т. д. Я считаю следующую идею очень полезной:

tar cf - . | tar xCf directory -

Метаданные сами по себе могут стать существенными издержками в очень больших (кластерных) файловых системах, но rsync и cp будут делиться этимпроблема.

rsync часто является предпочтительным инструментом (и в общем случае приложения - мой обычный выбор по умолчанию), но, вероятно, есть много людей, которые вслепую используют rsync, не продумывая его до конца.

14 голосов
/ 27 апреля 2015

Команда, как написано, создаст новые каталоги и файлы с текущей датой и отметкой времени, а вы будете владельцем. Если вы являетесь единственным пользователем в вашей системе и делаете это ежедневно, это может не иметь большого значения. Но если сохранение этих атрибутов имеет для вас значение, вы можете изменить свою команду с помощью

cp -pur /home/abc/* /mnt/windowsabc/

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

Альтернативная команда с rsync будет

rsync -avh /home/abc/* /mnt/windowsabc

При использовании rsync -a обозначает «архив», который сохраняет все упомянутые выше атрибуты. -v указывает на «verbose», который просто перечисляет, что он делает с каждым файлом при запуске. -z здесь опущен для локальных копий, но для сжатия, что поможет, если вы выполняете резервное копирование по сети. Наконец, -h указывает rsync сообщать о размерах в удобочитаемых форматах, таких как МБ, ГБ и т. Д.

Из любопытства я запустил одну копию, чтобы заправить систему и избежать смещения при первом запуске, а затем рассчитал следующее при тестовом запуске 1 ГБ файлов с внутреннего SSD-накопителя на жесткий диск, подключенный через USB. Они просто копируются в пустые целевые каталоги.

cp -pur    : 19.5 seconds
rsync -ah  : 19.6 seconds
rsync -azh : 61.5 seconds

Кажется, что обе команды примерно одинаковы, хотя архивирование и разархивирование явно обременяют систему, где пропускная способность не является узким местом.

6 голосов
/ 08 сентября 2016

Особенно, если вы используете файловую систему копирования при записи, такую ​​как BTRFS или ZFS, rsync намного лучше.

Я использую BTRFS, и у меня есть это в моем ~/.bashrc:

alias cp="rsync -ah --partial --inplace --info=progress2"

Важным флагом здесь для CoW FS, таких как BTRFS, является --inplace, поскольку он только копирует измененную часть файлов, не создает новых для небольших изменений между файловыми индексами и т. Д. См. this .

3 голосов
/ 14 июня 2011

Для локальной копии единственным преимуществом rsync является то, что он позволит избежать копирования, если файл уже существует в целевом каталоге. Определение «уже существует» - это (a) то же имя файла (b) того же размера (c) та же временная метка. (Может быть, тот же владелец / группа; я не уверен ...)

«Алгоритм rsync» отлично подходит для инкрементальных обновлений файла по медленной сетевой ссылке, но он не будет стоить вам много денег за локальную копию, так как ему нужно прочитать существующий (частичный) файл, чтобы запустить его «diff» "вычисление.

Так что, если вы часто запускаете команду такого рода, и набор измененных файлов невелик по сравнению с общим количеством файлов, вы должны обнаружить, что rsync работает быстрее, чем cp. (Также у rsync есть опция --delete, которая может оказаться полезной.)

2 голосов
/ 11 ноября 2018

Вопрос не в том, что эффективнее.

Команды 'rsync' и 'cp' не эквивалентны и достигают разных целей.

1-rsync может сохранить время создания существующих файлов. (используя опцию -a)
2-rsync запустит многопроцессорность и передачу с использованием локальных или сетевых сокетов. (т.е. разделить себя на несколько процессов)
3- Многопроцессорная обработка и многопоточность увеличат вашу пропускную способность при копировании большого количества маленьких файлов и даже с несколькими большими файлами.

Таким образом, нижняя строка rsync предназначена для больших данных, а cp для локального копирования меньшего размера. (МБ в диапазоне малых ГБ). Когда вы начнете получать несколько ГБ или в диапазоне TB, используйте rsync. И, конечно, сетевые копии, rsync полностью.

1 голос
/ 07 марта 2019

Имейте в виду, что при внутренней передаче файлов на компьютере, т. Е. Не по сети, использование флага -z может привести к значительным различиям во времени, необходимом для передачи.

Перевод в пределах одной машины

Case 1: With -z flag:
    TAR took: 9.48345208168
    Encryption took: 2.79352903366
    CP took = 5.07273387909
    Rsync took = 30.5113282204

Case 2: Without the -z flag:
    TAR took: 10.7535531521
    Encryption took: 3.0386879921
    CP took = 4.85565590858
    Rsync took = 4.94515299797
0 голосов
/ 16 ноября 2018

, если вы используете cp, не сохраняет существующие файлы при копировании папок с тем же именем.Допустим, у вас есть следующие папки:

/myFolder
  someTextFile.txt

/someOtherFolder
  /myFolder
    wellHelloThere.txt

Затем вы копируете одну поверх другой:

cp /someOtherFolder/myFolder /myFolder

Результат:

/myFolder
  wellHelloThere.txt

По крайней мере, так происходитна macOS, и я хотел сохранить файлы diff, поэтому я использовал rsync.

...