it-swarm-id.com

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

Saya telah membaca utas ini:

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

Bagaimana Anda meminta rsync untuk menyalin file dan menghapusnya di sisi penerima yang tidak ada di sisi pengirim, dengan pengecualian? (mis. jangan hapus repositori Mercurial .hg di 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 membuat rsync menghapus semua yang ada di jalur penerima yang tidak ada di jalur pengiriman, kecuali hal-hal yang cocok dengan dont_delete_me. Pertanyaan saya sekarang adalah: Apakah rsync menyimpan file di sisi penerima yang cocok dengan dont_delete_me bahkan jika tidak ada di sisi pengirim yang cocok dengan dont_delete_me?

29

Jika Anda menggunakan --delete dan --exclude bersama apa yang ada di lokasi yang dikecualikan tidak akan dihapus bahkan jika file sumber dihapus.

Tapi itu menimbulkan masalah bahwa folder itu tidak akan rsync 'd sama sekali. Jadi Anda akan membutuhkan pekerjaan rsync lain untuk sync folder itu.

Misalnya.

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

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

Anda tidak dapat melakukannya sebagai satu liner.

33
Richard Holloway

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 -n pilihan untuk melakukan dry-run, dan jangan ubah --delete hingga --delete-excluded!)

Menjalankan perintah menyebabkan properti berikut:

  • Direktori sumber src tetap tidak dimodifikasi
  • Folder tujuan dest cocok dengan folder sumber kecuali bahwa:

    • item pada do_not_send_to_dest daftar tidak dikirim ke tujuan, dan
    • item pada do_not_modify_in_dest daftar dibiarkan tidak dimodifikasi di tujuan.
  • (Catatan: Tidak ada masalah untuk item yang tidak ada terdaftar di salah satu dari "do_not_ "file.)

Penjelasan

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

Peringatan:

  • Jika item pada do_not_send_to_dest daftar sudah ada di tujuan, lalu:

    • perintah ini tidak menghapus item itu dari tujuan (kecuali item tersebut dihapus terlebih dahulu dari direktori sumber)
    • Perhatian: mengubah --delete hingga --delete-excluded akan 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 ".

4
user2533809