rsync çalışmayan dizini hariç tut


34

Fedora 17 64-bit kullanıyorum ve rsync --exclude=/home/ben/<dir>beklendiği gibi çalışmıyor.

Giriş rsyncdizinimi bir başparmak sürücüye çalışıyorum, ancak kesinlikle önbellek tutan ve dosya oluşturan dizinleri dışlamak istiyorum. Kullandığım komut bu:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

Ancak, içeriği ~/buildve ~/.ccachetarafından kopyalanmaktadır rsync. Neyi yanlış yapıyorum?


1
Bence dışlama kalıpları işe yaramıyor.
Sören

Yanıtlar:


37

Küresel rsyncbir öncülüğünde başlayan filtre kuralları /vardır demirlemiş transferi köküne. Man sayfasının "INCLUDE / EXCLUDE DESEN KURALLARI" bölümünden alıntı:

eğer desen / ile başlarsa, o zaman dosya hiyerarşisinde belirli bir noktaya tutturulur, aksi halde yol adının sonuna karşı eşleştirilir. Bu, düzenli ifadelerde baştaki ^ ifadesine benzer. Bu nedenle "/ foo", "aktarımın kökü" nde (genel bir kural için) veya birleştirme dosyasının dizininde (dizin başına bir kural için) "foo" adıyla eşleşir.

Komutunuzda ( rsync ... -arv /home/ben home-ben/) dosya /home/ben/fooaktarılacaktır home-ben/ben/foo. Aktarımın kökü home-benve doğru filtre yolu /ben/foo. Böylece,

  • uygun /home/ben/.ccachebir filtre yoluna ihtiyacınız var/ben/.ccache
  • uygun /home/ben/build/bir filtre yoluna ihtiyacınız var/ben/build/

Daha ayrıntılı bir açıklama, rsync(1)man sayfasının "DAHİLİ DAHİL / DAHİLİ HATALAR" bölümünde bulunabilir .


Sadece liderliği dışarıda /bırakmanın mutlaka istediğin şey olmadığını unutmayın. Aynı man sayfa bölümünden tekrar alıntı yapmak:

Niteliksiz bir "foo", ağacın herhangi bir yerinde "foo" adıyla eşleşir, çünkü algoritma tekrarlı bir şekilde yukarıdan aşağıya uygulanır; Her path bileşeni dosya adının sonunda bir dönüş alır gibi davranır. Bağlantısız "sub / foo" bile "sub" adlı bir dizinde bir "foo" bulunan hiyerarşideki herhangi bir noktada eşleşir. Aktarımın kökünde eşleşen bir kalıbı nasıl belirleyeceğinize dair tam bir tartışma için DAHİLİ DAHİLİ / DAHİLİ PATTERLER bölümüne bakın.

Böylece bir filtre deseni build/bir yapı dizin hiçbir yerinde eşleşecektir /home/benbile, /home/ben/many/sub/directories/build/.


2
En önemli nokta, maddeyi kesen unsurdur. Kaynak dizinin sonuna bir eğik çizgi eklerseniz (rsync -a kaynak / hedef) kaynak içeriğini rsync -a source destinationkopyalar , aksi takdirde kaynak dizinin kendisini hedefe kopyalar. Bu, dışlama ifadesini bildirmek için aktarımın kökünün ne olacağını belirler. Dışlama ifadesinde / ifadesinin uygun kullanımı yukarıda açıklanmaktadır. Özellikle rsync --exclude='/dir1' source destinationhiçbir şeyi dışlamayacağına dikkat edin.
pgoetz

11

excludeYollarınızın kaynak yolla göreceli olması gerektiğini düşünüyorum . Bunun yerine deneyebilir misin?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

İşte karşılaştırma için bir test:

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
Bu cevap yanlış. Göreceli bir dışlama yolu ile her yerde deseni dışlarsınız!
rubo77

Bu gönderi doğru. Eşleştirme metin tabanlıdır, dosya inode tabanlıdır. --verboseKomutun çıktısının gösterdiği herhangi bir yol, kullanmanız gereken formattır.
Sridhar Sarnobat

Bu benim için çalıştı.
Zhenyu

Kaynak yol '/' ise, mutlak bağıl yollardır, ancak yine de çalışmaz.
Sören

Bu benim için çalışan tek şey.
Jonathan

2

Bir senaryoda bu sorunu yaşadım (senin durumun olup olmadığını bilmiyorum). Çünkü bu komutu bir betikte kullandım ve bash yerine sh kullanıyordum. Senaryonun başında shebang'ı kontrol et.


1

Tam / ev yolunu (örneğin, sonunda eğik çizgi olmadan) senkronize ederseniz, dışlama düzeniniz işe yarar:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

Ancak, daha iyi bir eğik çizgi ile klasörün içeriğini yalnızca rsync:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

Bir yoksayma listesi de kullanabilirsiniz, bkz: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

Belirli bir klasörü rsync ile dışlamak için komuttaki göreceli yolu dikkate almanız gerekir. senin durumunda:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

nerede "ben" senkronize ettiğiniz klasördür

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.