Menggunakan rsync untuk memindahkan (bukan menyalin) file antar direktori?

55

Saya telah menggunakan rsync untuk menyalin file selama beberapa waktu. Pemahaman saya adalah bahwa rsync lebih cepat daripada cp ketika beberapa file yang akan ditransfer sudah ada di direktori tujuan, hanya mentransfer perbedaan inkremental (yaitu "delta").

Jika ini benar, apakah akan ada keuntungan menggunakan rsync untuk memindahkan konten folder A , misalnya, folder B , dengan B kosong?

Folder A memiliki hampir 1TB data (dan jutaan file di dalamnya). Transfer akan dilakukan melalui jaringan lokal ( A dan B berada di sistem file yang berbeda , keduanya dipasang pada superkomputer, misalnya A adalah NFS dan B adalah kilau ).

Selain itu, flag apa yang harus saya gunakan untuk meminta rsync untuk memindahkan (bukan menyalin) file dari A ke B (yaitu untuk menghapus A ketika transfer telah berhasil selesai)?

Amelio Vazquez-Reina
sumber
7
Saya pikir tidak rsyncbisa menggantikan mv. Saya berharap mvuntuk menjadi lebih cepat pada sebagian besar jenis sistem file ketika sumber dan tujuan berada dalam sistem file yang sama, karena rsyncharus membuat salinan tidak peduli apa, dan mvmungkin bisa lolos dengan mengubah beberapa entri direktori. Hal terdekat yang dapat saya temukan rsync mvadalah --remove-source-filesperintah, tetapi itu tidak menghapus direktori.
jw013
2
Terima kasih @ jw013! Hanya untuk memperjelas, file berada pada sistem file yang berbeda , dan transfer akan dilakukan pada jaringan . Apakah Anda tahu jika itu masih membuat mvlebih cepat?
Amelio Vazquez-Reina
1
Yah, mvtidak dapat beroperasi di jaringan - itu harus mengandalkan mount lokal (misalnya NFS). Jika bottleneck adalah jaringan, rsyncmungkin akan lebih cepat daripada mvkarena rsyncbisa melakukan kompresi.
jw013
2
Omong-omong cpmemiliki -uopsi untuk menyalin file sumber jika lebih baru dari file tujuan atau ketika file tujuan hilang
buru

Jawaban:

69

Anda dapat beralih --remove-source-fileske rsync untuk memindahkan file alih-alih menyalinnya.

Tetapi dalam kasus Anda, tidak ada gunanya menggunakan rsync, karena tujuannya kosong. Sebuah dataran mvakan melakukan pekerjaan itu secepat mungkin.

Dalam kasus Anda, apa yang dapat membuat perbedaan pada kinerja adalah pilihan protokol jaringan, jika Anda memiliki pilihan di antara NFS, Samba, sshfs, sftp, rsync over ssh, tar disalurkan ke ssh, dll. Kecepatan relatif dari metode ini tergantung pada ukuran file, bandwidth jaringan dan disk, dan faktor lainnya, jadi tidak ada cara untuk memberikan saran umum, Anda harus menjalankan tolok ukur sendiri.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6
Hanya untuk mengulangi apa yang dikatakan Caleb, jika Anda khawatir tentang korupsi karena misalnya jaringan yang rapuh, rsync dapat masuk akal, karena memverifikasi setiap file yang ditulisnya dengan memeriksa blok ketika ia menulisnya.
Daniel S. Sterling
5
yang --remove-source-fileshanya akan menghapus file dalam sumber. jika Anda ingin menghapus sumber kami, tidakkah Anda harus melakukan rm -rf (atau findsemua direktori dan pass -delete) pada sumber setelah rsync berjalan dengan sukses?
Trevor Boyd Smith
1
@ DanielS.Sterling rsync tidak memblokir checksum setelah menulisnya (menggunakan checksum untuk menemukan bagian mana dari file yang sudah diperbarui dan perlu disinkronkan). Anda dapat melakukan sinkronisasi kedua dengan --checksummengatakannya untuk memverifikasi hasil sinkronisasi pertama.
Clément
19

Karena --remove-source-filestidak menghapus direktori, saya mengeluarkan perintah berikut untuk memindahkan file ke ssh:

rsync -avh --progress --remove-source-files /home/user/mystuff/* [email protected]:/home/user/backup
find . -type d -empty -delete

Saya pribadi suka --progressfitur ini, karena saya melakukan transfer ini secara manual. Hapus jika Anda menggunakan skrip. Saya berharap itu memperlambat transfer secara marjinal. The findopsi menghapus perintah hanya menghapus direktori kosong - tidak menggunakan rm -rf, karena dapat menghapus direktori yang tidak kosong dalam kasus file tidak ditransfer. The -deletepilihan bergantian pada -depthpilihan sehingga pohon direktori kosong dihapus dari "bawah" up.

Kristian
sumber
3
-deletejauh lebih baik daripada -exec rmdir {} +dll
lkraav
1
Saya akan melewatkan tanda bintang karena dan hanya memiliki garis miring / dengan jalan jika melakukan ini secara lokal. Jika Anda menggunakan asterisk rsync akan melewati file tersembunyi seperti .htaccess atau .htpasswd (jika ada)
Svetoslav Marinov
16

Secara umum seperti yang dikatakan Gilles tidak ada keuntungan menggunakan rsyncmemindahkan file ketika mvakan mendapatkan pekerjaan yang sama dilakukan lebih sederhana dan tidak ada potensi kecepatan perolehan antara sistem file biasa.

Namun ada kalanya ada keuntungan. Secara khusus, jika Anda memiliki keraguan tentang stabilitas sumber, tujuan, atau mesin yang melakukan pekerjaan, menggunakan rsyncmemberi Anda kemampuan melanjutkan. Ini bisa menjadi keuntungan penting jika Anda mentransfer sangat besar dan, katakanlah, jaringan listrik Anda tidak dapat diandalkan. Menggunakan rsync akan menjadi cara yang lebih stabil untuk menghindari korupsi data jika terjadi kegagalan dan mengambil di mana Anda tinggalkan.

Caleb
sumber
5
Saya akan mengatakan ini adalah keuntungan besar. Bahkan, saya katakan mvhanya lebih baik jika target dan sumbernya berada di partisi yang sama, sehingga mvhanya mengedit metadata file daripada melakukan salinan.
Nomen
2
Satu kali yang saya butuhkan rsyncdaripada mv adalah ketika saya ingin mempertahankan struktur folder (jika Anda menggunakan --relative).
Sridhar Sarnobat
15

apakah akan ada keuntungan menggunakan rsync untuk memindahkan isi folder A, katakanlah, folder B, dengan B yang kosong?

Saya menemukan diri saya dalam situasi di mana rsync IS lebih cepat daripada mv hanya karena mv tidak dapat menangani jumlah file dalam direktori. Saya memiliki 1,8 juta foto dari kamera keamanan yang berjalan selama 20 hari dan perintah mv keluar dengan gagal karena tidak dapat mengalokasikan sumber daya.

rsync Namun, tampaknya menangani semua file tanpa masalah.

shadowv
sumber
1

Jika Anda ingin menggabungkan direktori secara rekursif ... pindahkan satu direktori ke direktori lain yang berpotensi menduplikasi nama direktori, maka silakan lihat jawaban saya di sini di serverfault.com. mvmelakukan pekerjaan yang buruk ketika direktori ada dengan nama yang sama, dan rsyncmenyalin (baca + tulis data lengkap) setiap file alih-alih hanya memindahkannya (baca dan tulis hanya metadata).

Peter
sumber
0

Tidak ada cara untuk benar-benar memindahkan file menggunakan rsync seperti yang dilakukan perintah Linux mv. Dengan menggunakan --remove-source-file, Anda pada dasarnya menyalin file ke tujuan dan kemudian menghapus file (kecuali direktori) dari sumbernya. Ini mungkin mencapai tujuan Anda untuk memindahkan file tetapi Anda TIDAK akan menghemat waktu atau operasi i / o.

Gehendra Acharya
sumber