Rsync'den, alıcı tarafında bulunmayan ve gönderen tarafta olmayan dosyaları silmesini isteyin


29

Bu konuları okudum:

Ancak söyleyebildiğim kadarıyla (belki bir şeyleri özlüyorum), aşağıdaki soruyu kapsamıyorlar:

rsyncİstisnalar dışında dosyaları kopyalamayı ve gönderici tarafında bulunmayan alıcı taraftakileri silmeyi nasıl istersiniz ? (örneğin .hg, gönderen tarafta depo olmasa bile, alıcı taraftaki ticari bir depoyu kaldırmayın ).

Bir ihtimal?

@Richard Holloway'ın yanıtını aşağıda ödünç almak. Aşağıdaki çizgiye sahip olduğumu söyle:

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

Anladığım kadarıyla, bu satır rsync, eşleşen yol dışında, gönderme yolunda bulunmayan alıcı yoldaki her şeyi siler dont_delete_me. Şimdi sorum şu: rsync , gönderen taraftaki hiçbir şey uyuşmasa bile eşleşen taraftaki dosyaları tutar mı?dont_delete_me dont_delete_me

Yanıtlar:


33

Kullanır --deleteve --excludebirlikte kullanırsanız , kaynak dosyalar kaldırılsa bile dışlanan konumdakiler silinmez.

Ancak bu, klasörün hiç olmayacağı sorununu gündeme getirmektedir rsync. Yani bu klasöre başka bir rsyncişe ihtiyacın olacak sync.

Örneğin.

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

Bunları diğer yollarla çalıştırabilirsiniz, ancak sonra kaldırılan tüm dosyaları siler ve sonra onları değiştirmez; bu da verimli değildir.

Tek bir astar olarak yapamazsın.


@Richard, teşekkürler. Cevabınız, asıl sorumun düşündüğümden daha kolay olabileceğini düşündürüyor. Tek satırı kullanırsam: rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/pathbu rsync, gönderim yolunda bulunmayan alıcı yoldaki her şeyi silmeyi başaramaz dont_delete_memı? En önemlisi, gönderen taraftaki hiçbir şeyrsync uyuşmasa dont_delete_me biledont_delete_me alıcı taraftakileri eşleştirecek mi? Bu durumda, sanırım ihtiyacım olan tek hat bu, değil mi?
Amelio Vazquez-Reina,

Haklısınız ancak bir satırda yaparsanız yeni dosyalar ve dont_delete_me klasöründe değişiklik yapamayacaksınız. Değişiklikleri ve eklemeleri senkronize etmek istemiyorsanız, --exclude bayrağını burada açıklandığı gibi kullanabilirsiniz.
Richard Holloway

@AmV Dışlanan dosyalar, --deleteaçıkça belirtmediğiniz sürece tarafından silinmez --delete-excluded. Rsync kılavuzunun açıklamasına --deleteve açıklamasına bakın --delete-excluded.
Gilles 'SO- kötülük' dur

4

Aşağıdaki çözümün amaçları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: ekleme -nkuru işletilen yapmak ve değişmez seçeneği --deleteiçin --delete-excluded!)

Komutu çalıştırmak aşağıdaki özelliklere neden olur:

  • Kaynak srcdizin değiştirilmemiş kalır
  • Hedef destklasör, bunun dışındaki kaynak klasörle eşleşir:

    • do_not_send_to_destlistedeki öğeler hedefe gönderilmez ve
    • do_not_modify_in_destListedeki öğeler hedefte değiştirilmemiş olarak bırakılır.
  • (Not: Var olmayan öğelerin " do_not_" dosyalarından birinde listelenmesi sorun değildir .)

açıklama

Rsync komut satırı argümanlarını soldan sağa okuduğu için, --deleteargüman , rsync'in dahili olarak "anahtar modlarını" (bir anlamda) seçerek ikinci --exclude-fromseçeneğin tekrar kullanılmasına, ancak farklı bir anlama gelmesine neden oluyor gibi görünüyor .

Uyarı:

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

    • bu komut o öğeyi hedeften kaldırmaz (öğe önce kaynak dizinden kaldırılmadıkça)
    • Dikkat: Değişen --deleteiçin --delete-excludedsizin iki listelerden birini listelenen hedef şeyi silecektir. xD (Belki de rsync açık / esnek olduğu için yazılmıştır, ancak bazıları nüanslıdır?)

Hafifçe kullanım test edilmiştir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.