Копіювати велике дерево каталогів локально? cp чи rsync?


230

Я маю скопіювати велике дерево каталогів, близько 1,8 ТБ. Це все місцеве. Я б за звичкою користувався rsync, проте мені цікаво, чи є багато сенсу, і чи варто скористатися cp.

Мене хвилюють дозволи та uid / gid, оскільки вони мають бути збережені в копії (я знаю, що rsync це робить). А також такі речі, як символьні посилання.

Пункт призначення порожній, тому мені не потрібно турбуватися про умовне оновлення деяких файлів. Це все локальний диск, тому мені не потрібно турбуватися про ssh чи мережу.

Причина, яку я спокусив би від rsync, полягає в тому, що rsync може зробити більше, ніж мені потрібно. rsync файли контрольних сум. Мені це не потрібно, і я стурбований тим, що це може зайняти більше часу, ніж ср.

То що ви вважаєте, rsyncчи cp?


2
Якщо rsync робить саме те, що ви хочете, щоб це зробити, якщо ви вже добре знайомі з його використанням для цього конкретного додатка, і якщо він працює досить швидко, щоб задовольнити ваш смак, то чому б на землі ви хотіли б переключитися?
одинадцять81

2
Тому що я стурбований тим, що rsync займе більше часу, ніж cp, оскільки rsync робить багато контрольних сум, які CP не буде робити
Rory

1
Напруженість процесора контрольної суми невелика порівняно з входом диска / мережі. Якщо диск не знаходиться в одній і тій же системі, і ОС може зробити якісь розумні копії дисковода в контролері шини.
Мартін Бекетт

3
Перевірка суми проводиться для файлів, які відрізняються за розміром та перевіркою часових позначок. Якщо ви параноїдальні (як, наприклад, після відключення живлення під час копіювання), ви можете змусити перевірити суми на всіх файлах, але на локальній передачі, це зазвичай повільніше, ніж починати з нуля.
korkman

3
Можливо, йому цікаво покращити робочий процес, і не закопує голову в пісок, думаючи, що знає все. Цей коментар мене справді дратує.
Мартін Конечний

Відповіді:


204

Я би використовував rsync, оскільки це означає, що якщо він перерваний з будь-якої причини, то ви можете легко його перезапустити з дуже невеликими витратами. А будучи rsync, він навіть може перезапустити частину через великий файл. Як зазначають інші, він може легко виключати файли. Найпростіший спосіб зберегти більшість речей - це використовувати -aпрапор - "архів". Тому:

rsync -a source dest

Хоча UID / GID та символьні посилання зберігаються -a(див. -lpgo), Ваше запитання означає, що ви можете отримати повну копію інформації файлової системи; і -aне включає жорсткі посилання, розширені атрибути або ACL (на Linux) або вищевикладені вилки або ресурси (на OS X.) Таким чином, для надійної копії файлової системи вам потрібно буде включити ці прапори:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

ЦП за замовчуванням почнеться знову, хоча -uпрапор "копіюється лише тоді, коли файл SOURCE буде новішим, ніж цільовий файл, або коли файл відсутній" . І -aпрапор (архіву) буде рекурсивним, а не копіювати файли, якщо вам доведеться перезапустити та зберегти дозволи. Тому:

cp -au source dest

5
Прапор -u cp, мабуть, не найкраще рішення, оскільки він не виявить частково скопійований / пошкоджений файл. Приємна річ у rsync полягає в тому, що ви можете мати її md5 суму файлів для виявлення відмінностей.
Чад Хунейкутт

3
Додавання параметра -w (--whole-file) дозволить прискорити перервану rsync, оскільки вона просто скопіює файл замість контрольної суми.
hayalci

13
насправді rsync виявляє локальні передачі та дозволяє копіювати цілі файли без контрольної суми автоматично.
korkman

22
і - прогрес, який справді корисний!
Метт

12
-P або --progress показує прогрес для кожного файлу окремо. Це корисно для копіювання великих файлів, а не для багатьох (тисяч) маленьких файлів, оскільки це означає набагато більше результатів, які ви не можете прочитати. Він не показує загального прогресу всіх файлів разом.
SPRBRN

106

Під час копіювання в локальну файлову систему я завжди використовую такі параметри rsync:

# rsync -avhW --no-compress --progress /src/ /dst/

Ось мої міркування:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

Я бачив на 17% швидші передачі, використовуючи наведені вище параметри rsync для наступної команди tar, запропонованої іншою відповіддю:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
У мене є така помилка: rsync: --no-compress: unknown option@Ellis Percival.
альпер

Це швидко освітлюється. Швидше це зробити rm -rf /src/.
dgo

2
Як і @alper, --no-compress не був варіантом для моєї версії rsync (у CentOS 7); Я використовував --compress-level = 0 замість цього.
Пол,

79

Коли мені доводиться копіювати велику кількість даних, я зазвичай використовую комбінацію дьогтю та rsync. Перший прохід - це його націлити, приблизно так:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

Зазвичай із великою кількістю файлів знайдуться файли, з якими з будь-якої причини не може працювати. Або, можливо, процес буде перервано, або якщо це міграція файлової системи, ви, можливо, захочете зробити початкову копію перед фактичним кроком міграції. У будь-якому випадку, після початкової копії, я роблю крок rsync, щоб синхронізувати все це:

# cd /dst; rsync -avPHSx --delete /src/ .

Зверніть увагу на те, що кінець косої риски /src/є важливим.


6
+1 Я знайшов дьоготь, як правило, для великих копій швидше, ніж rsync. Мені подобається ідея закінчити фінальну rsync.
Джефф Фріц

2
дьоготь - хороший вибір, якщо dest dir порожній. Хоча мій шлях був би: cd $ DSTDIR; тар c -C $ SRCDIR. | tar
asdmin

19
У цьому і полягає краса цього методу. Вам не потрібно подвоїти простір, тому що ви ніколи насправді не створюєте проміжний файл tar. Дьоготь перед трубою упаковує дані та передає їх у витоку, а дьоготь після труби схоплює її з stdin та розпаковує.
Чад Хунейкутт

4
Я зробив cp -a для передачі 12gb, і цей метод для 42gb передачі. Дегтярний метод зайняв приблизно 1/4 часу.
NGaida

3
Я також ставлю pvв середину, щоб можна було спостерігати за прогресом, оцінюючи розмір усіх даних, що використовуються df. Я також використовував --numeric-owner, оскільки вихідний диск був з іншої системи, і я не хотів tartar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
возити

14

rsync

Ось rsync, який я використовую, я віддаю перевагу cp для простих команд, а не цього.

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

Ось спосіб, який ще безпечніший, cpio. Це приблизно так швидко, як дьоготь, можливо, трохи швидше.

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

дьоготь

Це також добре, і продовжується на помилках читання.

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

Зауважте, що це лише для місцевих копій.


Чому ви використовуєте прапорці -S і -D для rsync?
miyalys

7

Що б ти не віддав перевагу. Просто не забувайте про -aвимикач, коли ви вирішили використовувати cp.

Якщо вам справді потрібна відповідь: я б використовував rsync, оскільки він набагато гнучкіший. Потрібно відключитись до завершення копіювання? Просто ctrl-c і відновіть, як тільки спина. Потрібно виключити деякі файли? Просто використовуйте --exclude-from. Потрібно змінити право власності чи дозволи? rsync зробить це за вас.


Що робить прапор -p знову?
Рорі

1
Він зберігатиме право власності, часові позначки та дозволи.
innaM

5
cp -a було б краще.
Девід Пашлі

Справді. Відповідь змінилася відповідно.
innaM

7

rsyncКоманда завжди обчислює контрольні суми на кожен байте він передає.

Параметр командного рядка --checksumстосується лише того, чи використовуються контрольні суми файлів для визначення, які файли потрібно передавати чи ні, тобто:

-c, --checksum пропустити на основі контрольної суми, а не за часом та розміром "

На сторінці відображається також таке:

Зауважте, що rsync завжди перевіряє, що кожен переданий файл був реконструйований правильно на приймальній стороні, перевіряючи його контрольну суму всього файлу, але що автоматична перевірка після передачі не має нічого спільного з цим параметром перед передачею "Чи потрібен цей файл бути оновленим? " перевірити.

Так rsyncсамо, завжди, обчислюється контрольна сума всього файлу на стороні, що приймає, навіть коли -c/ --checksumпараметр "вимкнено".


14
Поки ваша публікація додала сюди цікаву інформацію, зйомки та образи зменшують цінність вашої публікації. Цей сайт не є форумом для неконструктивних ренти. Якщо вам вдалося змінити джерело, чи подали ви свої зміни як виправлення? Ви розмістили свою версію на Github чи щось таке? Якщо ви ставитесь до цього так сильно, може бути краще, якщо б ви спробували зробити щось трохи більш конструктивне, а не зайве ображати.
Зоредаче

Так, останній абзац був насправді не потрібний.
Політ Шервіна

6

rsync -aPhW --protocol=28допомагає пришвидшити ці великі копії за допомогою RSYNC. Я завжди rsync, тому що думка пройти через 90GiB і вона порушує мене від CP


2
Яке значення використання старшого протоколу в цьому командному рядку?
ewwhite

1
На комп'ютері mac старша версія Rsync, що постачається, висить на новіших оборотах протоколу rsync, таких як 29. Якщо говорити про перехід на старіший протокол, воно НЕ перевіряється знову і знову.
oneguynick

Я думаю, що число 28 вже не дійсне?
SPRBRN

5

rsync чудовий, але має проблеми з дійсно великими деревами каталогів, оскільки він зберігає дерева в пам'яті. Я просто шукав, чи зможуть виправити цю проблему, коли знайшов цю тему.

Я також виявив:

http://matthew.mceachen.us/geek/gigasync/

Ви також можете вручну розбити дерево і запустити кілька rsyncs.


12
Якщо ви використовуєте версію 3, воно не зберігає все дерево в пам’яті, якщо воно велике, він використовує алгоритм наростання рекурсії: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS
Kyle Brandt

5

Ця нитка була дуже корисною, і оскільки було так багато варіантів для досягнення результату, я вирішив порівняти їх декілька. Я вважаю, що мої результати можуть бути корисними, щоб інші відчули, що працює швидше.

Для того, щоб перемістити 532 Гб даних, розподілених між 1 553 200 файлами, у нас були ті часи:

  • rsync зайняли 232 хвилини
  • tar зайняло 206 хвилин
  • cpio зайняло 225 хвилин
  • rsync + parallel зайняло 209 хвилин

У моєму випадку я вважав за краще використовувати rsync + parallel. Я сподіваюся, що ця інформація допомагає більшості людей визначитися з цими альтернативами.

Повний орієнтир опублікований тут


404 сторінки не знайдено
Amedee Van Gasse

1
Дякуємо @AmedeeVanGasse URL було виправлено невдовзі після того, як ви повідомили :)
arjones

Чому б не тестування cp? Це заголовок питання!
calandoa

@calandoa Я думаю, що cpце небезпечно, тобто: коли він порушується, ви повинні почати все спочатку, тому я віддаю перевагу варіантам, які можна відновити, ergo rsync- це моє улюблене :)
arjones

3

Коли я роблю локальну копію локального каталогу, мій досвід полягає в тому, що "cp -van src dest" на 20% швидше, ніж rsync. Що стосується перезавантажуваності, то це робить "-n". Вам просто потрібно rm частково скопійований файл. Не боляче, якщо це не ISO або якесь таке.


2

АРЖ ТАКЕ СТАРА ШКОЛА !! Я дуже сумніваюся, що ARJ та / або rsync дадуть продуктивність.

Безумовно, що я завжди роблю, це використовувати cpio:

find . -print | cpio -pdm /target/folder

Це майже швидко, ніж CP, безумовно, швидше, ніж дьоготь і без нічого труби.


2
"Оригінальні утиліти cpio and find були написані Діком Хайтом під час роботи в Unix Support Group AT & T. Вони вперше з'явилися в 1977 році в PWB / UNIX 1.0" - на cpioсторінці чоловіків FreeBSD .
Кріс С

3
cpioна жаль, має 8 ГБ верхньої межі для файлів.

" без труби нічого " [sic]. За винятком findкоманди, як ви її перерахували, в ній є труба:find . -print | cpio -pdm /target/folder
warren

1

Ви обов'язково хочете спробувати rclone . Ця річ з розуму швидко:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

Це локальна копія з та на жорсткий диск LITEONIT LCS-256 (256 ГБ).

Ви можете додати --ignore-checksumпід час першого запуску, щоб зробити його ще швидшим.



0

tar також зробив би цю роботу, але не продовжуватиме її переривати, як і rsync.


Стара відповідь, але чи не TAR для створення стислих архівів файлів? Як це можна використовувати для передачі таких файлів, як rsync чи cp?
Політ Шервіна

@SherwinFlight CD-джерело; смола cf -. | (cd dest; tar xf -)
pgs

0

Що робити, якщо ви використовуєте ARJ?

arj a -jm -m1 -r -je filepack /source

де -jm -m1рівні стиснення і -jeробить його виконуваним. Тепер у вас є інкапсульований баш файлів.

Потім для вилучення на цільову карту

filepack -y  

де буде зроблена вихідна карта (де -yзавжди приймається, перезаписується, пропускається тощо)

Потім можна скапати ftp пакет файлів до цільової області та виконати його, якщо це можливо.


1
Arj? Хіба це не вимерло у 80-х?
Майкл Хемптон

можливо, на початку 90-х, якщо вірити вікіпедії
Мтт

0

Є кілька прискорень, які можна застосувати до rsync:

Уникайте

  • -z/ --compress: стиснення завантажує лише процесор, оскільки передача відбувається не через мережу, а через оперативну пам’ять.
  • --append-verify: відновити перервану передачу. Це звучить як гарна ідея, але він має небезпечний випадок відмови: будь-який файл призначення такого ж розміру (або більше), ніж джерело, буде ІГНОРОВАНО. Крім того, він перевіряє суми всього файлу в кінці, тобто немає значної швидкості --no-whole-fileпри додаванні небезпечного випадку відмови.

Використовуйте

  • -S/ --sparse: перетворити послідовності нулів у розріджені блоки
  • --partialабо -Pщо --partial --progress: зберегти будь-які частково передані файли для подальшого відновлення. Примітка. Файли не матимуть тимчасового імені, тому переконайтеся, що ніхто не очікує використання пункту призначення, поки вся копія не буде завершена.
  • --no-whole-fileтак що все, що потрібно повторити, використовує передачу дельти. Читання половини частково переданого файлу часто набагато швидше, ніж його повторне написання.
  • --inplace щоб уникнути копіювання файлу (але тільки якщо нічого не читає пункт призначення, поки вся передача не завершиться)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.