Meminta rsync untuk menghapus file di sisi penerima yang tidak ada di sisi pengirim, dengan pengecualian di sisi penerima

29

Saya telah membaca utas ini:

Tapi, sejauh yang saya tahu (mungkin saya kehilangan sesuatu), mereka tidak mencakup pertanyaan berikut:

Bagaimana Anda meminta rsyncuntuk menyalin file dan menghapusnya di sisi penerima yang tidak ada di sisi pengiriman, dengan pengecualian? (mis. jangan menghapus repositori lincah .hgdi sisi penerima, bahkan jika tidak ada repositori di sisi pengirim).

Satu kemungkinan?

Meminjam dari jawaban @Richard Holloway di bawah ini. Katakanlah saya memiliki baris berikut:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Sejauh yang saya mengerti, baris ini akan rsyncmenghapus semua yang ada di jalur penerima yang tidak ada di jalur pengiriman, kecuali hal-hal yang cocok dont_delete_me. Pertanyaan saya sekarang adalah: Apakah rsync menyimpan file di sisi penerima yang dicocokkan oleh dont_delete_me bahkan jika tidak ada di sisi pengirim yang cocok dont_delete_me?

Amelio Vazquez-Reina
sumber

Jawaban:

33

Jika Anda menggunakan --deletedan --excludebersama - sama apa yang ada di lokasi yang dikecualikan tidak akan dihapus bahkan jika file sumber dihapus.

Tapi itu menimbulkan masalah bahwa folder tidak akan rsyncsama sekali. Jadi Anda perlu rsyncpekerjaan lain ke syncfolder itu.

Misalnya.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Anda bisa menjalankan ini sebaliknya, tetapi kemudian akan menghapus semua file yang dihapus dan kemudian menggantinya, yang tidak efisien.

Anda tidak dapat melakukannya sebagai satu liner.

Richard Holloway
sumber
Terima kasih @Richard. Jawaban Anda membuat saya berpikir bahwa pertanyaan awal saya mungkin lebih mudah daripada yang saya pikirkan. Jika saya menggunakan baris tunggal:, rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathbukankah itu akan rsyncmenghapus semua yang ada di jalur penerima yang tidak ada di jalur pengiriman, kecuali yang cocok dengan dont_delete_me? Yang paling penting, apakah rsyncsemua pihak yang ada di sisi penerima akan cocok dont_delete_me meskipun tidak ada yang cocok dengan pihak pengirimdont_delete_me ? Jika itu masalahnya, saya pikir itu satu-satunya jalur yang saya butuhkan, kan?
Amelio Vazquez-Reina
Anda benar tetapi Anda juga tidak akan mendapatkan file baru dan perubahan pada folder dont_delete_me jika Anda melakukannya dalam satu baris. Jika Anda tidak ingin menyinkronkan perubahan dan penambahan, maka Anda bisa menggunakan flag --exclude seperti yang Anda jelaskan di sini.
Richard Holloway
@AmV File yang dikecualikan tidak dihapus oleh --delete, kecuali jika Anda secara eksplisit menentukan --delete-excluded. Lihat deskripsi --deletedan --delete-excludeddalam manual rsync.
Gilles 'SANGAT berhenti menjadi jahat'
4

Saya menemukan bahwa solusi berikut berfungsi untuk tujuan saya:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Catatan: Tambahkan -nopsi untuk melakukan dry-run, dan jangan ubah --deleteke --delete-excluded!)

Menjalankan perintah menyebabkan properti berikut:

  • Direktori sumber srctetap tidak dimodifikasi
  • destFolder tujuan cocok dengan folder sumber kecuali bahwa:

    • item dalam do_not_send_to_destdaftar tidak dikirim ke tujuan, dan
    • item dalam do_not_modify_in_destdaftar dibiarkan tidak dimodifikasi di tujuan.
  • (Catatan: Tidak ada masalah untuk item yang tidak ada terdaftar di salah satu file " do_not_".)

Penjelasan

Saya kira ketika rsync membaca argumen baris perintah dari kiri ke kanan, --deleteargumen tersebut tampaknya menyebabkan rsync untuk secara internal "beralih mode" (dalam arti tertentu), memungkinkan penggunaan kedua --exclude-fromopsi lagi tetapi dengan makna yang berbeda.

Peringatan:

  • Jika item dalam do_not_send_to_destdaftar sudah ada di tujuan, maka:

    • perintah ini tidak menghapus item itu dari tujuan (kecuali item tersebut dihapus terlebih dahulu dari direktori sumber)
    • Perhatian: mengubah --deleteke --delete-excludedakan menghapus semua yang ada di tujuan yang terdaftar di salah satu dari dua daftar Anda. xD (Mungkin rsync ditulis terbuka / fleksibel, tetapi ada yang bernuansa?)

Penggunaan ringan diuji.

Saya menggunakan " rsync version 3.0.9 protocol version 30".

pengguna2533809
sumber