Birden çok kaynak klasörü rsync nasıl


34

Birden fazla kaynağa rsync yapmak istiyorum ve bunu başarmanın en iyi yolunu merak ediyorum.

Örneğin

/etc/fstab
/home/user/download

3 çözüm düşündüm:

  • 1. Çözüm

rsync'e çoklu çağrı

rsync -a /etc/fstab bkp
rsync -a /home/user/download bkp

aleyhte olan: stat'ü kabul etmiş olmak daha zor

  • 2. Çözüm

tobackupsembolik link içeren bir klasör oluşturun ve -Lseçenekleri kullanın.

sync -aL /home/user/tobackup bkp

con: yedeklenecek içerik sembolik bağlantılar içermemelidir

  • Çözüm 3

dosyaları yedeklemeye taşı ve orijinal konumunda sembolik bağlantı oluştur

rsync -a /home/user/tobackup bkp

con: bazı manuel config

Hangisini tavsiye edersiniz ?

Daha iyi bir yolu var mı?


Yanıtlar:


33

Birden fazla kaynak argüman iletebilirsiniz.

rsync -a /etc/fstab /home/user/download bkp

Bu yaratır bkp/fstabve bkp/downloadverdiğiniz ayrı komutlar gibi. Bunun yerine kaynak yapının korunması arzu edilebilir. Bunu yapmak /için kaynak olarak kullanın ve hangi dosyaların kopyalanacağını belirlemek için include-exclude kurallarını kullanın. Bunu yapmanın iki yolu vardır:

  • /***Dizin ağacının tamamını kopyalamak istediğinizde dizinlerin sonuna gelecek şekilde, her bir dosyayı ve kendisine giden her bir dizin bileşenini açıkça ekleyin :

    rsync -a \
        --include=/etc --include=/etc/fstab \
        --include=/home --include=/home/user --include='/home/user/download/***' \
        --exclude='*' / bkp
    
  • Tüm üst düzey dizinleri /*/(rsync'in geçeceği /etcve /homekopyalanacak dosyaları ararken) ve ikinci düzey dizinleri /*/*/(for /home/user) ile birlikte ekleyin , ancak hiçbir dosyanın kopyalanmadığı dizinleri çıkarın. Bu daha uygundur, çünkü ebeveynleri açıkça listelemeniz gerekmez. Hatta kullanabilirsiniz --prune-empty-dirs --include='*/'yerine düzey sayısını sayma, ama hiçbiri kuralları şey dışında eşleşebilir dahil olsa bile bu dizinleri keşfetmek için bütün dosya sistemini geçmesini öngören rsync gibi burada pratik değildir /etcve /home/user/download.

    rsync -a --prune-empty-dirs \
        --include='/*/' --include='/*/*/' \
        --include=/etc/fstab \
        --include='/home/user/download/***' \
        --exclude='*' / bkp
    

1
Harika, fakat dizin yapısını bkp içinde nasıl tutabilirim?
Rodrigo

Yani, bkp / etc / fstab ve bkp / home / user / dowlonad? Ya da belki / bkp / fstab ve bkp / download?
Rodrigo

@Rodrigo Cevabımı düzenlemiştim
Gilles 'kötülük olmayı bırak'

13

Gilles'un cevabını gerçekten seviyorum, ancak bence, dizin yapısını koruyarak birden fazla klasörü senkronize etme zorunluluğunun en iyi --relativeseçenekle birlikte birden fazla kaynak argümanının iletilmesiyle karşılandığını da eklemek isterim .

Bu durumda aşağıdaki gibi bir şeyimiz olabilir:

rsync -aR /etc/fstab /home/user/download bkp

hangi neden olacaktır bkp/etc/fstabve bkp/home/user/download.

Bununla ilgili en iyi bölüm (rsync v. 2.6.7'den beri) özünde, dizin yapısının ne kadarını alıcıda çoğaltmak istediğimizi kontrol edebileceğimize inanıyorum.
( Buradaki--relative seçenek hakkındaki belgelere bakın )

Mesela eğer bunu yaparsak

rsync -aR /home/./user1/download /home/./user2/download bkp

Birlikte sona ereceğini bkp/user1/downloadve bkp/user2/download.


2

Bu aynı zamanda çalışır - virgülle ayrılmış, kaynakların virgülle ayrılmış listesini içeren kaşlı ayraçlar.

rsync -vap --progress --stats root@server:{/etc,/root/backups,/home/ultralazer} /mnt/bigdrive

Cp ve diğer bazı yardımcı programları kullanarak küme ayraçları sytnax'ı çağırdığınızda olanlara biraz benzer:

cp -vr /etc /root/backups /home/{ultralazer,zerocool} /mnt/bigdrive

Bununla ssh portunu nasıl belirtirsiniz? Bu sözdizimi kullanırken işe yarıyor gibi görünüyor-e
tcurdt
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.