it-swarm-tr.com

Rsync'ten alıcı taraftaki istisnalar dışında alıcı taraftaki dosyaları silmesini isteme

Bu konuları okudum:

Ancak, söyleyebildiğim kadarıyla (belki bir şey kaçırıyorum), aşağıdaki soruyu kapsamıyorlar:

rsync 'dan istisnalar dışında, gönderen tarafta mevcut olmayan dosyaları kopyalamayı ve silmeyi nasıl istersiniz? (örneğin, gönderen tarafta depo olmasa bile alıcı taraftaki Mercurial veri havuzunu .hg kaldırmayın).

Bir ihtimal mi?

@Richard Holloway'ın aşağıdaki cevabından borçlanma. Diyelim ki şu satırım var:

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

Anladığım kadarıyla, bu satır, dont_delete_me İle eşleşenler dışında, rsync gönderme yolunda olmayan her şeyi siler. Şimdi sorum şu: rsync alıcı tarafta dont_delete_me ile eşleşen dosyaları dont_delete_me? ile eşleşse bile tutar mı?

29

Eğer kullanırsan --delete ve --exclude birlikte hariç tutulan konumda olanlar kaynak dosyalar kaldırılsa bile silinmez.

Ancak bu, klasörün hiç rsync 'd olmaması sorununu doğurur. Yani bu klasörü rsync yapmak için başka bir sync işine ihtiyacınız olacak.

Örneğin.

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

Bunları başka bir şekilde çalıştırabilirsiniz, ancak daha sonra kaldırılan tüm dosyaları silip değiştirir, bu da o kadar verimli değildir.

Tek astar olarak yapamazsınız.

33
Richard Holloway

Aşağıdaki çözümün benim amacım için işe yaradığını buldum:

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

(Not: Kuru çalışma yapmak için -n Seçeneğini ekleyin ve --delete İle --delete-excluded!)!)

Komutun çalıştırılması aşağıdaki özelliklere neden olur:

  • Kaynak src dizini değiştirilmedi
  • Hedef dest klasörü, aşağıdakiler dışında kaynak klasörle eşleşir:

    • do_not_send_to_dest listesindeki öğeler hedefe gönderilmez ve
    • do_not_modify_in_dest listesindeki öğeler hedefte değiştirilmez.
  • (Not: Var olmayan öğelerin "do_not_" Dosyalarından birinde listelenmesi sorun değildir.)

açıklaması

Rsync komut satırı argümanlarını soldan sağa okurken sanırım --delete Argümanı rsync'in dahili olarak "modları değiştirmesine" (bir anlamda) --exclude-from yine farklı bir anlamla.

Uyarı:

  • do_not_send_to_dest Listesindeki bir öğe hedefte zaten varsa, o zaman:

    • bu komut bu öğeyi hedeften kaldırmaz (öğe ilk olarak kaynak dizinden kaldırılmazsa)
    • Dikkat:--delete İfadesini --delete-excluded Olarak değiştirmek, hedefinizdeki iki listenizden birinde listelenen her şeyi silecektir. xD (Belki rsync açık/esnek olacak şekilde yazılmıştır, ancak bazılarının nüansları vardır?)

Hafif kullanım test edilmiştir.

"rsync version 3.0.9 protocol version 30" Kullanıyorum.

4
user2533809