Копировать или команду rsync

83

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

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

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

Shantanuo
источник
как именно это работает не так, как ожидалось?
lunixbochs
12
-u указывает на «обновление»: копировать только отсутствующие или старые файлы. -r указывает на «рекурсивный»: детализация структуры каталогов. Я должен был найти это, помогая другим новичкам. :-)
mightypile
для получения информации о конкретных флагах в разделах справки команд я обычно использую что-то вроде этого, <cp --help | grep -e -u> или, если вы хотите получить информацию о флаге 'r', используйте <cp --help | grep -e -r>. Он покажет вам только ту часть справки, содержание которой вы написали после "-e".
paramvir 05

Ответы:

58

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

Марчика
источник
59

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

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

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

tar cf - . | tar xCf directory -

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

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

ckg
источник
19

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

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

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

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

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

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

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

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

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

могучая куча
источник
6

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

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

alias cp="rsync -ah --inplace --no-whole-file --info=progress2"

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

Геремия
источник
1
Согласно --inplaceопционной инструкции : The option implies --partial. Так что я думаю, --partialэто не требуется, по крайней мере, в текущей версии.
Dcortez
4

Имейте в виду, что при внутренней передаче файлов на машине, то есть не при передаче по сети, использование флага -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
Аюш Лал Шреста
источник
3

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

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

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

Немо
источник
3

На самом деле вопрос не в том, что эффективнее.

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

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

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

Эллисон
источник
«rsync может сохранить время создания существующих файлов. (с использованием параметра -a)» - «cp -a» может делать то же самое, и даже лучше, чем «rsync -a». «Лучше» означает сохранение как можно большего количества исходных данных и метаданных; прочтите unix.stackexchange.com/questions/443911/… . Rsync и cp почти эквивалентны в отношении -a.
Rublacava
Спасибо @Rublacava. Я искал в Интернете специально для -aсравнения.
Франсуа
1

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

/myFolder
  someTextFile.txt

/someOtherFolder
  /myFolder
    wellHelloThere.txt

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

cp /someOtherFolder/myFolder /myFolder

результат:

/myFolder
  wellHelloThere.txt

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

h3dkandi
источник