Kaynak klasörden silinen dosyaları rsync'den nasıl silebilirim?


194

Geçenlerde oyun sunucularını barındırmak için Ubuntu Sunuculu bir makine kurdum. Makinedeki belirli bir klasörde oyun dünyası dosyalarının sık sık yedeklenmesini sağlayan her oyun sunucusu için bir yedekleme eklentisi yükledim. Ayrıca, cronher gece rsync -aseçeneğini kullanarak bu yedekleri otomatik olarak Dropbox klasörüme kopyalamak için bir görev kurdum .

Birkaç ay sonra Dropbox hesabım saklama sınırına ulaştı ve bu kadar fazla yedek tutamayacağımı fark ettim, bu yüzden oyun sunucusu yedekleme eklentisini bu kadar fazla yedek tutmayacak şekilde yapılandırdım, sonra birkaç gün beklediğini görmek için bekledim. haftalık olarak yapılması planlandığı gibi eski yedeklemeleri silin. Yedekleme eklentisi sonunda işini yaptı ve eski yedeklemeleri silerdi, bu yüzden rsynccron görevini daha sonra eski klasörleri Dropbox klasörümden silerek kaynak klasörle eşleştirecek şekilde bekliyordum, ancak yapmadı. Bu yüzden birkaç sorum var:

  • Varsayılan olarak, yok rsyncsadece eklemek kaynak klasörüne eklenmiş olan hedef klasöre dosya ve değiştirmek kaynak klasörüne değiştirilmiş dosyaları ancak silmek DEĞİL kaynak klasöründen silinen dosyaları?

  • Bu durumda, rsyncbunu yapmanın en iyi yolu nedir? Hedef klasörün kaynak klasörü mükemmel şekilde yansıtmasını istiyorum ve bu kaynak klasörden silinmiş dosyaları silmek anlamına gelir.

Bunun için kılavuz sayfasında listelenen bazı seçeneklerin rsyncolduğunu biliyorum, ancak hile yapamadığımdan beri.

Yanıtlar:


227

Hedefteki dosyaları silmek için --deleteseçeneği komutunuza ekleyin . Örneğin:

rsync -avh source/ dest/ --delete

15
Kaynağın bir dizin olduğundan emin olun. Kullanmak source/* dest/işe yaramaz.
Tom Saleeba

3
Bu olayı buldum --deleteveya --delete-afterbazı hatalar nedeniyle silmeyecek: "GÇ hatasıyla karşılaşıldı - dosya silme işlemi atlandı". Bu ekleme --ignore-errorsseçeneğini çözümlemek ve hataları ayrı ayrı hata ayıklamak için
MHT

12
Mükemmel çalışıyor! Çalışsa da -n, --dry-run, çalıştırmadan önce rsync, özel olarak bunlar gibi seçenekler söz konusu olduğunda , HER ZAMAN seçeneğini kullanmalarını tavsiye ederim --delete. Herhangi bir olası baş ağrısından kaçınır :).
ivanleoncz

2
@MHT: Yorumunuz olmadan hiçbir cevap tamamlanmış gibi görünmüyor.
Lonnie Best

2
@ TheBicentennialMan -a ima ediyor -r .
x-yuri

45

Bu komuttaki seçeneklerinden bazılarını kullanırken rsync komutu herhangi bir dosyayı silmez delete. Bu nedenle, kaynakta herhangi bir dosya veya klasör eklendiyse, silinmeden hedefe senkronize edilir.

rsyncKaynak dosyalardan yedekleme yapmak için kullanmanız ve find ... rmzaman aralığı veya dosya boyutu için dosyaları silmek için kullanmanızı öneririm :

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Yukarıdaki kod bloğu, kaynaktan bir yedekleme yapın ve daha sonra en son değiştirilen sürenin 2 aydan fazla olduğu her dosyayı silin.

GÜNCELLEME

deleteSeçeneklerin sadece TARGET için olduğunu belirlediğim için, bazı dosyalar kaynaktan kaldırılırsa, rsync --deletebunları TARGET'ten kaldırın. Ve deleteseçeneği, afterve beforeman sayfasında belirtildiği gibi:

--delete-before         receiver deletes before transfer, not during

Anlamına gelir:

  1. rsync, SOURCE'dan kaldırılan HEDEF'den dosyayı siler.
  2. rsync dosyaları senkronize etmeye başlar.

--delete-after receiver deletes after transfer, not during

Anlamına gelir:

  1. rsync dosyaları senkronize etmeye başlar.
  2. rsync, senkronizasyondan sonra dosyayı SOURCE'dan kaldırılan TARGET içinden sil.

NOT : cihaz --delete-{before/after}sadece HEDEF'te.


1
Cevap için teşekkürler!! Rsync için bir "delete" seçeneğine mi bakıyorsunuz? Neden sadece rsync için "delete" seçeneğini kullanamıyorum?
user254251

@ user254251, Eğer silerseniz, rsync komutu hemen dosyaları siler. Ancak bu durumda herhangi bir hata için daha fazla zaman var.
shgnInc

Doğru anlıyorsam, hataları önlemek için silme görevini rsync görevinden ayırmam gerektiğini söylüyorsunuz. Yine de bir sorum var. Rsync kılavuz sayfası, silme görevini kopyalama görevinden önce veya sonra çalıştırarak ayırma amacına hizmet eden görünen bazı seçenekleri listeler. Örneğin, --delete-before ve --delete-after adlı iki seçenek görüyorum. Bu seçeneklerle rsync, tanımladığınız yöntemle aynı etkiye sahip midir? Kılavuzdaki her seçeneğin tam açıklamasını okudum, ancak açıklamalarında anlamadığım bazı bilgiler var.
user254251

@ user254251, Cevap güncellendi. Dosyaları, TARGET'ten rsync'deki zaman sınırlamasına göre silmenin bir yolu olup olmadığını bilmiyorum .
shgnInc

Teşekkürler! Yani sadece -delete-before seçeneğini kullanırsam hatalardan güvende olduğumu mu düşünüyorsunuz? Zaman aşımı belirtmiyorum, bu nedenle eğer rsync silme aşaması aktarım aşamasını geciktirirse endişelenmeme gerek kalmamalı. rsync günde bir kez çalışır ve bu, bir sonraki senkronizasyondan önce yedekleme dosyalarını senkronize etmek için yeterli zamandır, bu nedenle senkronizasyonu zaman sınırlamasına gerek duymamalıyım.
user254251

6

Bu komut, artış verilerini kopyalar ve uzak sunucu ile senkronize tutar.

  1. Yalnızca artımlı verileri kopyalar.
  2. Herhangi bir veri kaynaktan silinirse silinir.
  3. Hedefteki veriler silinirse kaynaktan tekrar kopyalanacaktır.
  4. Temel olarak bu komut her iki ortamı da senkronize eder.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Örnek:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
Bence -W sadece artımlı verileri kopyalamakla kalmıyor, her zaman bütün dosyaları da kopyalıyor.
Tulains Córdova

Bu komutu şu komutu uygulayarak aldım: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Herhangi bir hata bir rsync scync sırasında varsa, rsync düzgün kullanıldığında bile, olması gereken dosyaları silmez --delete, --delete-afterya --delete-before.

Bu nedenle rsync hatalarının giderilmesi önemlidir.

Hatalarımın çoğu, --permsLinux olmayan bir dosya sistemiyle eşitleme yaparken bu seçeneği kullanmaktan kaynaklanıyordu . Ben yerini zaman --permsile --no-perms, bu hatalar gittiler ve sonra çalıştı silme.

--permsTamam, bir Linux dosya sisteminden başka bir Linux dosya sistemine eşitleme yaparken Tamam, ancak Linux'tan Linux olmayan bir dosya sistemine (NTFS, FAT gibi) eşitleme yapıyorsanız --permshatalara neden olur , çünkü rsync Linux izinlerini ayarlayamaz. linux olmayan dosya sistemleri . Yine, hatalar = silme yok.

- Olmayan Linux bölüme senkronize ederken şu kullanmak --no-permsbu sabotaj bu hataları önlemek için --delete, --delete-afterya da --delete-before.

Bundan sonra hala hatalar alıyorsanız ve bu hataların nasıl yapıldığını çözemiyorsanız, senkronizasyon dışındaki dosyaları silmeye özel bir komut çalıştırabilirsiniz:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

Yukarıdaki komut, senkronize edilmemiş olanları siler ancak dosyaları senkronize etmez. Yani bundan sonra tekrar senkronize etmelisin. Bu komut, bu cevabı temel alır , ancak ben de --ignore-errorsargümanı ekledim , bu yüzden hata olsa bile silecekti.


1
Bahşiş için teşekkürler! Ben 5 yıl önce bu sorunun asıl yazarıyım. Bunu gönderdiğiniz için çok sevindim, çünkü yakın bir zamanda bir NTFS sürücüsüyle senkronizasyon kurmayı planlıyordum ve muhtemelen -a "seçeneğini kullanmayı planladığım için izinler hatasıyla karşılaşacaktım. İzinleri eşitleyen rsync (diğer şeylerin yanı sıra). Ben de notlarıma "-no-perms" ekledim. Şimdi rsync -a --no-perms --delete-before kullanmayı planlıyorum. Bir sorum var: --delete-senk önce silme işlemini çalıştırarak dosya silme ile ilgili sorunlardan kaçınmaz mıydınız? Bunun amacı olduğunu düşündüm.
user254251

@ user254251 - Emin değilim. Sanırım gerçekten ne kadar erken "sildiğine" bağlı. Silme başlamadan önce bir hatayla karşılaşırsanız, vidalayın. Sana tavsiyem kıçındaki keskin acıları sevmiyorsan, istediğin zaman NTFS'den kaçınmaktır :). NTFS'den NTFS'ye düzgün çalışır. Linix NTFS için iyi çalışıyor. "Linux dosya sistemi" nden "Linux olmayan Dosya Sistemi" ne bırakınız; Silme işleminin doğru yapıldığından emin olmak çok acı verici. Bunu başarabilirsiniz, ancak hedef sürücüyü EXT4 olarak biçimlendirmek yerine, sorunun değmeyeceğine karar verdim.
Lonnie En iyi
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.