Saya dulu rsync
menyalin sejumlah besar file, tetapi OS saya (Ubuntu) dimulai kembali secara tidak terduga.
Setelah reboot, saya berlari rsync
lagi, tetapi dari output di terminal, saya menemukan bahwa rsync
masih menyalin yang sudah disalin sebelumnya. Tapi saya dengar itu rsync
bisa menemukan perbedaan antara sumber dan tujuan, dan karena itu hanya menyalin perbedaan. Jadi saya bertanya-tanya dalam kasus saya apakah rsync
dapat melanjutkan apa yang tersisa terakhir kali?
sudo rsync -azvv /home/path/folder1/ /home/path/folder2
. (3) Sumber dan target adalah NTFS, sumber beli adalah HDD eksternal, dan target adalah HDD internal. (3) Sekarang sedang berjalan dan belum selesai.--modify-window
opsi membantu dengan itu).Jawaban:
Pertama-tama, mengenai bagian "resume" dari pertanyaan Anda,
--partial
cukup beri tahu pihak penerima untuk menyimpan sebagian file yang ditransfer jika akhir pengiriman menghilang seolah-olah mereka benar-benar ditransfer.Saat mentransfer file, mereka sementara disimpan sebagai file tersembunyi di folder target mereka (misalnya
.TheFileYouAreSending.lRWzDC
), atau folder yang dipilih secara khusus jika Anda mengatur--partial-dir
sakelar. Ketika transfer gagal dan--partial
tidak disetel, file tersembunyi ini akan tetap berada di folder target di bawah nama samar ini, tetapi jika--partial
diatur, file akan diubah namanya menjadi nama file target yang sebenarnya (dalam kasus ini,TheFileYouAreSending
), meskipun file tersebut tidak lengkap. Intinya adalah Anda nantinya dapat menyelesaikan transfer dengan menjalankan rsync lagi dengan salah satu--append
atau--append-verify
.Jadi,
--partial
tidak dengan sendirinya melanjutkan transfer yang gagal atau dibatalkan. Untuk melanjutkannya, Anda harus menggunakan salah satu dari bendera yang disebutkan di atas pada proses selanjutnya. Jadi, jika Anda perlu memastikan bahwa target tidak akan pernah berisi file yang tampaknya baik-baik saja tetapi sebenarnya tidak lengkap, Anda tidak boleh menggunakan--partial
. Sebaliknya, jika Anda ingin memastikan bahwa Anda tidak pernah meninggalkan file gagal yang tersesat di direktori target, dan Anda tahu Anda akan dapat menyelesaikan transfer nanti,--partial
ada di sana untuk membantu Anda.Sehubungan dengan
--append
sakelar yang disebutkan di atas, ini adalah sakelar "resume" yang sebenarnya, dan Anda dapat menggunakannya baik yang Anda gunakan atau tidak--partial
. Sebenarnya, ketika Anda menggunakan--append
, tidak ada file sementara yang pernah dibuat. File ditulis langsung ke target mereka. Dalam hal ini,--append
memberikan hasil yang sama seperti--partial
pada transfer yang gagal, tetapi tanpa membuat file-file sementara yang tersembunyi.Jadi, untuk meringkas, jika Anda memindahkan file besar dan Anda ingin opsi untuk melanjutkan operasi rsync yang dibatalkan atau gagal dari titik tepat yang
rsync
berhenti, Anda perlu menggunakan--append
atau--append-verify
mengaktifkan upaya berikutnya.Seperti @Alex tunjukkan di bawah, karena versi 3.0.0
rsync
sekarang memiliki opsi baru--append-verify
,, yang berperilaku seperti yang--append
dilakukan sebelum saklar itu ada. Anda mungkin selalu menginginkan perilaku--append-verify
, jadi periksalah versi Andarsync --version
. Jika Anda menggunakan Mac dan tidak menggunakanrsync
darihomebrew
, Anda (setidaknya hingga dan termasuk El Capitan) akan memiliki versi yang lebih lama dan perlu menggunakan--append
daripada--append-verify
. Mengapa mereka tidak melanjutkan perilaku--append
dan malah menyebut pendatang baru--append-no-verify
agak membingungkan. Either way,--append
padarsync
sebelum versi 3 sama dengan--append-verify
pada versi yang lebih baru.--append-verify
tidak berbahaya: Itu akan selalu membaca dan membandingkan data di kedua ujungnya dan tidak hanya menganggap mereka sama. Ini melakukan ini menggunakan checksum, jadi itu mudah di jaringan, tetapi itu memerlukan membaca jumlah data bersama di kedua ujung kawat sebelum benar-benar dapat melanjutkan transfer dengan menambahkan ke target.Kedua, Anda mengatakan bahwa Anda "mendengar bahwa rsync dapat menemukan perbedaan antara sumber dan tujuan, dan karenanya hanya menyalin perbedaannya."
Itu benar, dan itu disebut transfer delta, tetapi itu hal yang berbeda. Untuk mengaktifkan ini, Anda menambahkan
-c
, atau--checksum
beralih. Setelah saklar ini digunakan, rsync akan memeriksa file yang ada di kedua ujung kabel. Itu melakukan ini dalam potongan, membandingkan checksum di kedua ujungnya, dan jika mereka berbeda, itu hanya mentransfer bagian file yang berbeda. Tetapi, seperti yang ditunjukkan @Jonathan di bawah, perbandingan hanya dilakukan ketika file memiliki ukuran yang sama di kedua ujungnya - ukuran yang berbeda akan menyebabkan rsync mengunggah seluruh file, menimpa target dengan nama yang sama.Ini membutuhkan sedikit perhitungan pada kedua ujung awalnya, tetapi bisa sangat efisien dalam mengurangi beban jaringan jika misalnya Anda sering membuat cadangan file yang sangat besar file ukuran tetap yang sering berisi perubahan kecil. Contoh yang muncul dalam pikiran adalah file gambar hard drive virtual yang digunakan dalam mesin virtual atau target iSCSI.
Perlu dicatat bahwa jika Anda menggunakan
--checksum
untuk mentransfer sejumlah file yang benar-benar baru ke sistem target, rsync masih akan menghitung checksum mereka pada sistem sumber sebelum mentransfernya. Kenapa saya tidak tahu :)Jadi, singkatnya:
Jika Anda sering menggunakan rsync untuk hanya "memindahkan barang-barang dari A ke B" dan ingin pilihan untuk membatalkan operasi itu dan kemudian melanjutkannya, tidak menggunakan
--checksum
, tapi jangan gunakan--append-verify
.Jika Anda sering menggunakan rsync untuk mencadangkan barang, menggunakan
--append-verify
mungkin tidak akan banyak membantu Anda, kecuali jika Anda terbiasa mengirim file besar yang terus bertambah ukurannya tetapi jarang dimodifikasi setelah ditulis. Sebagai tip bonus, jika Anda mencadangkan ke penyimpanan yang mendukung snapshotting sepertibtrfs
atauzfs
, menambahkan--inplace
sakelar akan membantu Anda mengurangi ukuran snapshot karena file yang diubah tidak dibuat ulang melainkan blok yang diubah ditulis langsung di atas yang lama. Switch ini juga berguna jika Anda ingin menghindari rsync membuat salinan file pada target ketika hanya perubahan kecil yang terjadi.Saat menggunakan
--append-verify
, rsync akan berperilaku seperti biasanya pada semua file dengan ukuran yang sama. Jika mereka berbeda dalam modifikasi atau cap waktu lain, itu akan menimpa target dengan sumber tanpa meneliti file-file tersebut lebih lanjut.--checksum
akan membandingkan konten (checksum) dari setiap pasangan file dengan nama dan ukuran yang identik.DIPERBARUI 2015-09-01 Berubah untuk mencerminkan poin yang dibuat oleh @Alex (terima kasih!)
DIPERBARUI 2017-07-14 Berubah untuk mencerminkan poin yang dibuat oleh @Jonathan (terima kasih!)
sumber
--partial
sudah cukup.--partial-dir
- sepertinya itu adalah peluru yang sempurna untuk ini. Saya mungkin telah melewatkan sesuatu sepenuhnya;)--partial
: rsync menyalin file ke nama sementara, koneksi terputus, remote rsync akhirnya memindahkan file itu ke nama biasa dan berhenti, kemudian berjalan kembali dengan--partial
dan tanpa--append
, file sementara baru diinisialisasi dengan salinan file jarak jauh yang ditransfer sebagian, kemudian salinan berlanjut dari tempat sambungan mati. (Ubuntu 14.04 / rsync 3.1)--checksum
? Menurutnyaman
itu lebih berkaitan dengan memutuskan file mana yang akan ditandai untuk ditransfer daripada dengan delta-transfer (yang, mungkin, adalahrsync
perilaku default).TL; DR:
Cukup tentukan direktori parsial seperti halaman manual rsync merekomendasikan:
Penjelasan yang lebih panjang:
Sebenarnya ada fitur built-in untuk melakukan ini menggunakan
--partial-dir
opsi, yang memiliki beberapa keunggulan dibandingkan--partial
dan--append-verify
/--append
alternatif.Kutipan dari halaman manual rsync:
Secara default, rsync menggunakan nama file sementara acak yang akan dihapus ketika transfer gagal. Seperti disebutkan, menggunakan
--partial
Anda dapat membuat rsync menyimpan file yang tidak lengkap seolah-olah berhasil ditransfer , sehingga dimungkinkan untuk kemudian menambahkannya menggunakan--append-verify
/--append
opsi. Namun ada beberapa alasan mengapa hal ini tidak optimal.File cadangan Anda mungkin tidak lengkap, dan tanpa memeriksa file jarak jauh yang masih belum diubah, tidak ada cara untuk mengetahuinya.
Jika Anda mencoba untuk menggunakan
--backup
dan--backup-dir
, Anda baru saja menambahkan versi baru dari file ini yang bahkan tidak pernah keluar sebelumnya ke riwayat versi Anda.Namun jika kita menggunakan
--partial-dir
, rsync akan menyimpan file parsial sementara, dan melanjutkan mengunduh menggunakan file parsial itu saat Anda menjalankannya, dan kami tidak mengalami masalah di atas.sumber
Anda mungkin ingin menambahkan
-P
opsi ke perintah Anda.Dari
man
halaman:Jadi alih-alih:
Melakukan:
Tentu saja, jika Anda tidak ingin pembaruan kemajuan, Anda bisa menggunakan
--partial
, yaitu:sumber
rsync
. Sangat penting untuk menekankan, bahwa--partial
itu sendiri tidak melanjutkan transfer yang gagal. Lihat jawaban saya untuk perincian :)-P
sudah cukup dalam kasus saya. Versi: klien memiliki 3.1.0 dan server memiliki 3.1.1. Saya mengganggu transfer satu file besar dengan ctrl-c. Saya kira saya kehilangan sesuatu.vv
? yaituv
digunakan 2 kali?-azvvP
?Saya pikir Anda secara paksa menelepon
rsync
dan karenanya semua data akan diunduh saat Anda mengingatnya lagi. gunakan--progress
opsi untuk menyalin hanya file-file yang tidak disalin dan--delete
opsi untuk menghapus file apa pun jika sudah disalin dan sekarang tidak ada di folder sumber ...Jika Anda menggunakan ssh untuk masuk ke sistem lain dan menyalin file,
beri tahu saya jika ada kesalahan dalam pemahaman saya tentang konsep ini ...
sumber
--delete
akan menghapus file di tujuan yang tidak ada di sumbernya. Yang kurang serius adalah itu--progress
tidak mengubah cara sesuatu disalin; itu hanya memberi Anda laporan kemajuan pada setiap file saat disalin. (Saya memperbaiki kesalahan serius; menggantinya dengan--remove-source-files
.)Saya menggunakan skrip sederhana ini. Jangan ragu untuk menyesuaikan bendera tertentu dan / atau mengucilkannya.
sumber
Tiba terlambat untuk ini, tetapi saya memiliki pertanyaan yang sama dan saya menemukan jawaban yang berbeda.
The
--partial
flag ( "menyimpan file sebagian ditransfer" dirsync -h
) berguna untuk file besar, seperti--append
( "menambahkan data ke file yang lebih pendek"), tapi pertanyaannya adalah tentang sejumlah besar file.Untuk menghindari file yang telah disalin gunakan
-u
(atau--update
: "lewati file yang lebih baru pada receiver").sumber