RSYNC Kaynak Dizinlerini Silmiyor


27

Bir sunucudan gerekli dosyaları almak için rsync kullanıyorum, ardından yerel olarak bunları aldığımda dosyaları sunucudan siliyorum. Çalıştırdığım tam komut aşağıda.

Bu , kaynak sunucudaki dosyaları başarıyla siler , ancak boş klasörler hala kalır. Mesaj veya hata alamadım. Tüm çıktı normal. Belki de bu amaçlanan işlevdir.

Rsync'e dizinler dahil herşeyi temizlemesini nasıl söyleyebilirim?

rsync --progress -vrzh --remove-source-files

Her iki uçta da sürüm 3.0.9.


Yanıtlar:


13

--remove-source-filesGözlemlediğiniz davranış tam olarak şu şekilde belirtilir man rsync:

--remove kaynak-files

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

StackExchange ve ServerFault'daki bu iki tartışma açıkça gösterildiğinden , dizinleri kaldırmak için belirli bir komut yoktur . Çözüm, iki ayrı komut yayınlamak olduğunu önerdi:

 rsync -av --ignore-existing --remove-source-files source/ destination/ && \
 rsync -av --delete `mktemp -d`/ source/ 

Bu iki yayında önerilen komutun son parçası,

 rmdir source/

(şimdi boşaltılmış) kaynak dizini kaldırmak için gerekli olan bu formda bu forma sahiptir, çünkü OP'ler ve cevaplar aynı makinede büyük miktarda dosyayı taşımak için rsync kullanıyor. Sizin durumunuzda bunu manuel olarak yapmanız gerekecektir.


5
rsync --deleteÖneri o rsync tamamlanmadığını ihtimalini göz ardı ya da kaynağında yeni dosya olmadığından, tehlikelidir. @ slhck'in findaşağıdaki yöntemi çok daha güvenli.
Sai,

29

Manpage bile diyor ki:

--remove-source-files   sender removes synchronized files (non-dirs)

Kaynağınızdaki boş dizinleri kaldırmak istiyorsanız, hala kalan dosyalar varsa, aşağıdakileri yapın:

find . -depth -type d -empty -delete

Ancak boş bir kök dizini rm -rf <directory>için elbette yeterli olacaktır.


5
evet, bu tek çözüm. aptalca eksik bir rsync özelliği ... rsync, bir dizindeki son dosyayı ne zaman işlemden geçirdiğini bilir ... boşsa bile dizini kaldırmak için yeterince kolaydır.
Erik Aronesty,

4
"Rm -rf" vermenin yarış koşullarına eğilimli olduğunu ve bundan vazgeçmediğine dikkat edin.
Raúl Salinas-Monteagudo

Üst düzey boş dizini find some_dir -depth -type d -empty -not -path some_dir -delete
silmeyen değişken

5

" Rm -rf " kullanarak içsel bir yarış koşulu vardır, yani rsync ve rm çağrıları arasında yeni oluşturulan dosyaları silebilirsiniz .

Kullanmayı tercih ederim:

rsync --remove-source-files -a Sunucu: Gelen / Gelen /

ssh sunucusu gelen-tipi d -delete'yi bulur

Bu, boş olmadıkça dizinleri SİLEMEZ.


2
rm -rfAyrıca bazı nedenlerden dolayı transfer değildi dosyaları kaldıracaktır.
Kristian,

1
Bu cevap , doğru sırayla işlem yapmayı söyleyen -depthseçeneği gözden kaçırıyor find. Bu eksikliğin sonucu olarak, yalnızca boş dizinler içeren dizinler (muhtemelen yinelemeli olarak) silinmez. @Slhck değişkeninin hakkı var.
Stéphane Gourichon

1

-m, --prune-empty-dirs boş dizin zincirlerini dosya listesinden budamak

--force boş olmasa bile kirleri silmeye zorlama


1
Bu sadece rsync'in boş dizinleri kopyalamasını önler. Boş dizinleri silmez.
Navin

1

Kaynak dosyaları kaldırın, ardından güvenli olması için dizinleri kaldırın.

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

GNU Parallel hakkında daha fazla bilgi

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.