rsync 'boş olmayan dizini silemiyor' hatalarını --force seçeneğiyle bile


28

Bu komutu çalıştırırken:

$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

Aşağıdaki çıktıyı alıyorum:

cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor

Okumaktan sonra man rsync, --forceseçeneğin rsync'e istenen boş olan bu boş dizinleri silmesini söyleyeceği izlenimini verdi .

Ref:

--force                 force deletion of dirs even if not empty

Boş olmayan dizinleri silmek için bu komutu nasıl değiştirebilirim?

İlgili olması durumunda Gentoo Base System 2.0.3 sürümünde rsync 3.0.8 sürümünü kullanıyorum.

Güncelleme:sudo Bunun bir dosya izinleri sorunu olmadığını açıkça belirtmek için komuta eklenmiştir .


Hedef hangi dosya sistemi? Dosya sisteminin onarıma ihtiyacı var mı?
Marcus Downing

Dosya sistemidir ext3. Dosya sistemine ihtiyaç duyulması veya onarılması mümkündür. Bir fscksonraki fırsatta olacağım ve sonuçları ile güncelleyin.
tommarshall

Ben sadece fscksistemi yaptım ve bu konu hala mevcut.
tommarshall

Yanıtlar:


39

Eklemeye çalıştın --delete-excludedmı?

"Uzak" tarafındaki dışlanan klasörlerdeki bir dizini rsync --deletesilerseniz, "yerel" sitenizdeki dışlanan klasörü silmez.


Adında bir klasör vardı uploadsiçinde html/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samplesve html/js/ckeditor/plugins/uicolor/yuidizinleri. Yardımın için teşekkürler.
tommarshall,

kullanıyorsanız, --delete-excludedancak yine de belirli dosyaları / dizinleri silinmeye devam etmek istemiyorsanız, bu dosyaları / dizini içine koyabilirsiniz --filter 'protect some_dir/', örneğin:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985

6

İşte bu sorunun olası kaynakları:

(1) Bu hata -b (--backup) seçeneğinin sonucu olabilir . Bu seçenek , dosya adına bir tilde ( ~ ) ekleyerek silinen her dosyanın yedeğini oluşturur . (Dosya adı açıkça bir yedekleme olduğu için bu beni şaşırttı, ancak dizin adını göremediğiniz için dizin adı değil.)

Aynı durumun olup olmadığını kontrol etmek için hedef dizininizi en derin seviyede okuyun ve herhangi bir tilde (~) bitiş dosyası olup olmadığını kontrol edin. Bu tilde eklenmiş dosya adlarının daha sonra bazı ortak dosya tarama sistemlerinde görünmez olduğunu ve bu yüzden onları göremeyeceğinizi unutmayın.

Bu sorunu çözmek için, --backup-dir = DIR seçeneğini tercih edin, örneğin --backup-dir = .rsync_bak.

(2) --exclude seçeneği aynı sonuçlara sahip olabilir. Muhtemelen davanda oluyor. Desen sistemi güçlüdür, ancak yanıltıcı olabilir. Örneğin, --exclude = '* ~' yazarsanız, bu, tüm tilde biten dosyaları atlar ve tam olarak yukarıdaki (1) deki gibi sonuçlanır.

rsync man sayfasından:

eğer desen / ile başlarsa, o zaman dosya hiyerarşisinde belirli bir noktaya tutturulur, aksi halde yol adının sonuna göre eşleşir.

Si, --exclude = uploads yazarsanız , dosya ağacınızın herhangi bir seviyesindeki "updloads" adlı tüm dosyaları hariç tutar .

Silinemeyen dizinlerinizin içinde "uploads" adlı bir dosya olup olmadığını kontrol edin.

Çözüm "--exclude = upload" "ı" --exclude = uploads "olarak değiştirmek olacaktır.


0

Kurulumumda ((kaynak, Ubuntu format tipi ext4'tür ve Western Digital tip fuseblk'i hedef alır) şöyle çalışır:

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD

2
Bunun hangi kısmı sorunu çözüyor?
Michael Hampton

0

Bunun yerine filtre dosyalarında kurallar kullanın --exclude. Bunlar, hariç tutulanları "dışlanabilen" olarak işaretlemenize izin verir; bu, dışlanan dosyaları içeren boş olmayan dizinleri silmenizi sağlar.

Ayrıntılar için bu cevaba bakınız.


-1

Bir dizinin silinmesi için boş olması gerekir, dosya sistemi normalde bunu gerektirir.

Bu nedenle normalde rsyncveya rmilk önce tüm içeriği tekrarlı bir şekilde siliniz ve sadece boş dizini siliniz.

Geçerli kullanıcı tüm dosyaların sahibi değilse, dosya sistemi izinleri bu dosyaları silmenize izin vermez. Kaldırılmayacaklarından, dizin boşaltılmaz ve silme başarısız olur.

İlk tahminim, bu dizindeki bazı dosyaların başka bir kullanıcıya ait olduğu, örneğin apache'nin veya hiç kimsenin kullanıcısı olmadığı yönünde.


Teşekkürler. Dizinlerdeki dosyalar gerçekten apache grubundaki bir kullanıcıya aittir, ancak bu komutu o kullanıcı olarak çalıştırmaya çalıştım ve aynı hataları aldım.
tommarshall

Ayrıca, bir dosya izinleri sorunu olsaydı, sorunu çözmek için 'sudo' ile aynı komutu çalıştırmayı beklerdim, ancak durum böyle değil. Ancak, lütfen yanılıyorsam bu konuda beni düzelt.
tommarshall

1
Komutu root olarak çalıştırmak, çoğu izin sorununu çözmelidir, evet. (Muhtemelen hala başarısız olacağı bir yer, bir nfs mount'a, bir diğerini değiştirilemez bir dosyaya isimlendirmek içindir) ls -laDizinin neden hala boş olmadığını görmek için basit bir kontrol . lsattrdeğişmez dosyaları gösterecektir.
HBruijn

Ek bilgi için teşekkürler, ancak lsattrlistelenen dizinlerden birinden aşağıdaki çıktılar: --------------- ./assets(i flag yok) ve dosya bir nfs mount'ta değil. Komutun neden sudo ile başarısız olduğunu düşündüğünüzün başka nedenleri var mı?
tommarshall

Orada herhangi bir sembolik bağlantı var mı, yoksa sadece gerçek dosyalar var mı?
Marcus Downing
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.