Apa perbedaan antara opsi hapus rsync?

119

Saya melihat pada halaman manual rsync bahwa ada sejumlah deleteopsi, tetapi tidak benar-benar memahami perbedaan di antara mereka. Apa perbedaan antara opsi-opsi ini?

 --del                   an alias for --delete-during
 --delete                delete extraneous files from dest dirs
 --delete-before         receiver deletes before transfer (default)
 --delete-during         receiver deletes during xfer, not before
 --delete-delay          find deletions during, delete after
 --delete-after          receiver deletes after transfer, not before
 --delete-excluded       also delete excluded files from dest dirs
Skilldrick
sumber
2
Mengapa --delete-beforedigambarkan sebagai (default)? Saya tidak mengerti apa (default)artinya.
Marco Marsala
1
Tidak lagi ditentukan sebagai default di manlaman untuk rsync version 3.1.2 protocol version 31. Namun, tebakan saya pada versi dengan teks yang dikutip adalah bahwa jika Anda hanya menggunakan --deletedaripada --delete-WHEN, maka itu seolah-olah Anda menentukan di --delete-WHENmana WHENdefaultnya before.
Tom Hale

Jawaban:

115
  • --del/--delete_during: Menghapus file dari direktori tujuan saat disalin (menghemat memori dibandingkan dengan --delete-before: --delete-beforemelakukan pemindaian terpisah untuk mencari yang dapat dihapus)

  • --delete: Menghapus file di direktori tujuan jika tidak ada di direktori sumber.

  • --delete-before: Hapus file di direktori tujuan sebelum menyalin file dengan nama yang sama dari direktori sumber

  • --delete-during: Hapus file di direktori tujuan WHILE menyalin file dengan nama yang sama dari direktori sumber

  • --delete-delay: Tandai dihapus saat transfer, tetapi tunggu sampai transfer selesai

  • --delete-after: Receiver menghapus setelah transfer, bukan sebelum ... Jika beberapa bagian rsync memindahkan file tambahan di tempat lain, Anda ingin ini, bukan --delete-delay, karena --delete-delaymemutuskan apa yang akan dihapus di tengah transfer, sedangkan --delete-aftermemeriksa direktori untuk file yang harus dihapus SETELAH semuanya selesai.

  • --delete-excluded: Menghapus file dari direktori tujuan yang secara eksplisit dikecualikan dari mentransfer dari direktori sumber.

Inti dari rsync bukan menyalin, ini adalah pengarsipan. Ini adalah perbedaan penting. Memproses file yang dihapus / diubah sangat penting, dan dalam banyak kasus bernuansa.

The --deletebendera khususnya adalah salah satu Saya telah melihat kacau berkali-kali. Banyak orang menggunakan rsync untuk memindahkan file ke penyimpanan prioritas rendah, dan dalam hal ini Anda ingin file yang Anda pindahkan masih ada di direktori tujuan. Bukan itu yang dihapus: --deletepastikan bahwa, ketika Anda menghapus file dari direktori sumber, itu juga dihapus dari direktori tujuan Anda, sehingga tujuan Anda tidak penuh dengan sampah ... Setelah melihat seorang pria menghapus cadangannya dengan memasukkan drive baru, dan tidak mematikan skrip rsync malamnya. Script melihat bahwa dir sumber sekarang kosong, dan itu menghapus setiap file di dir tujuan, sehingga mereka cocok.

Sebagian besar opsi lain terkait ruang atau kinerja. Ketika Anda menghapus file itu penting jika Anda ingin memastikan transfer berhasil sebelum Anda melakukan apa pun, tetapi jika perangkat Anda terlalu kecil untuk menangani 2 salinan dari semua informasi, Anda perlu menghapus saat Anda pergi, dll. Ini adalah sedikit aneh karena sejarahnya yang panjang di berbagai platform: beberapa opsi telah ditambahkan sehingga orang yang terbiasa dengan perilaku tertentu tidak akan bingung.

Satanicpuppy
sumber
3
Jadi apakah --delete dan --delete-before sama? man rsync tidak mengatakan kapan --delete menghapus file.
ppr
@ ppr: Tergantung pada sistem. Alasan ia memiliki begitu banyak opsi spesifik adalah karena delete pada Solaris! = Delete pada HP-UX! = Delete pada AIX! = Delete di Linux.
Satanicpuppy
Saat rsyncing seluruh direktori, apakah delete-aftermenghapus setiap file di antara sinkronisasi, atau hanya setelah seluruh dir telah dicerminkan? Saya pikir delete-aftersudah cukup untuk kebutuhan saya tetapi saya tidak mendapatkan ruang yang tersisa di perangkat ketika membuat cadangan salah satu drive saya.
Sridhar Sarnobat
1
@ Sridhar-Sarnobat: Baik. Itu memindahkan semua yang akan dipindahkan, dan ketika selesai, itu mulai menghapus sesuatu. Jika Anda ingin menghapusnya sebelum memindahkan semuanya, gunakan --delete-during
Satanicpuppy
2
Setelah beberapa pengalaman, saya menemukan bahwa bahkan delete-duringtidak selalu mencegah no space left on device(di Linux). Jadi delete-beforeadalah satu-satunya cara dijamin untuk menghindarinya (seperti saat mirroring drive yang hampir penuh, dan drive tujuan juga hampir penuh).
Sridhar Sarnobat
1

Ada dua hal yang terjadi:

  1. Siapa yang menghapus
  2. Ketika itu terjadi

Baik pengirim atau penerima dapat diinstruksikan untuk melakukan penghapusan (saya tidak yakin mengapa ini penting). Jadi ketika rsync dari satu komputer terhubung ke server rsync di sisi lain, ini menentukan siapa yang secara efektif mengeluarkan perintah delete.

Ketika itu terjadi sangat mudah ... sebelumnya berarti semua file dihapus, dan MAKA rsync menyalin file-file tersebut. selama berarti saat melewati daftar file, itu menghapus mereka ketika datang ke mereka, dan setelah itu menunggu sampai semua file ditransfer dan kemudian menghapus sisi jauh. Ini hanya penting ketika transfer terganggu.

Michael Pryor
sumber
Saya yakin tidak satu pun dari opsi ini yang terkait dengan menghapus sesuatu dari sisi pengirim . Semuanya (AFAIK) berhubungan dengan menghapus sesuatu dari sisi penerima . Juga, Anda berkata: "sebelum berarti semua file dihapus, dan MAKA rsync menyalin file-file itu" - apakah ini benar? Saya berharap --delete-beforeuntuk menghapus hanya file-file yang perlu hilang, tidak semua file! Tapi saya kira itu mungkin bahwa rsync menghapus semuanya dan kemudian mentransfer data "baru" (mungkin tidak berubah) ...
Quuxplusone
1
Ah, "menghapus dari sisi pengirim" adalah didukung oleh rsync, tapi nama pilihan yang --remove-source-files.
Quuxplusone
1

Satu hal lain yang layak disebutkan adalah bahwa jika direktori sumber Anda berakhir /*, maka rsync hanya akan mempertimbangkan file - file itu dan bukan direktori itu sendiri (dan dengan demikian tidak adanya file yang ingin Anda hapus pada tujuan).

Jika Anda menentukan opsi hapus di atas, tetapi rsync sepertinya tidak dihapus, maka periksa untuk memastikan Anda tidak menggumpal secara tidak sengaja dan memberikan daftar file saat Anda merujuk ke direktori itu sendiri.

Walt Stoneburner
sumber