2012-03-31 15 views
32

modeline göre dizin ve dosya içerme seçeneklerini dahil etme seçeneklerini hariç rsync sözdizimini doğru alıyorumda sorun yaşıyorum ve senaryoyu rsync ile işlenip işlenemeyeceğini merak ediyorum. İlk olarak, rsync'in yerel ana bilgisayarım ve uzaktaki ana bilgisayarım arasında iyi çalıştığını doğruladım. Bir dizinde düz bir senkronizasyon yapmak başarılı olur.Rsync kullanma ve

İşte böyle benim dosya sistemi görünüyor: Ne yapmak istiyorum çalıştırmak rsync alt dizinlerinde "file_11_" ile başlayan dosyalar üzerinde

uploads/ 
    1260000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1270000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1280000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 

ve ben sadece bir rsync işi çalıştırmak mümkün istiyorum Bu dosyaların tümünü alt dizinlerde senkronize etmek.

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

Bu sonuçları 0 dosyalar benim kuru vadede transferi için işaretlenmesini:

İşte çalışıyorum komut var. --include ve --exclude ifadelerinin diğer çeşitli kombinasyonlarını denedim, ancak hiçbir sonuç almamaya devam ettim veya hiçbir ekleme veya hariç tutma seçeneği ayarlanmış gibi her şeyi aldım.

Bunun nasıl yapılacağı hakkında bir fikri olan var mı?

cevap

67

sorun --exclude="*" böylece rsync asla dizinin içeriğini inceler, bu yüzden asla dizin --include ile eşleşen olurdu dosyaları içerdiğini fark eder, (örneğin) 1260000000/ dizini dışlamak için söylüyor olmasıdır.

Ne istediğini yakın şey bu olduğunu düşünüyorum:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

, ya da belki bu (bütün dizinleri ve file_11*.jpg eşleşen tüm dosyaları, ancak başka dosyaları içerir ki):

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(aynı konsept ama içerecektir dizinleri hakkında çok pickier).

+1

Teşekkürler! Tam ihtiyacım olan buydu. Benim senaryom aslında ikinci örneğinizde anlattığınız şeyden çok daha azdı, ama soruyu daha da basitleştirmek için sorumu basit tuttum. –

+0

@SheldonChang: Rica ederim! – ruakh

+5

Aslında içermek istediğiniz dosyaların ** parent ** dizinlerini dahil etmede (örn.) '--include =" */"' nin önemini unutmayın. – mabraham

7

Boş dizinleri ayarlamak için yukarıda önerilen yanıtı -m ekleyin.

2

rsync desen örnekleri hariç şunlardır:

"*"   means everything 
"dir1"  transfers empty directory [dir1] 
"dir*"  transfers empty directories like: "dir1", "dir2", "dir3", etc... 
"file*"  transfers files whose names start with [file] 
"dir**"  transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc... 
"dir***" same as above 
"dir1/*" does nothing 
"dir1/**" does nothing 
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc... 

Ve son bir not basitçe yolları değerlendirmek için başlangıçta kullanılan yıldız itimat yok olmasıdır; "**dir" gibi (tek klasör veya dosyalar için değil, yollarda kullanmak için tamam) ve iki yıldız işaretinin dosya adları için çalışmadığını unutmayın.

+0

Cevabınız, genel davranışı açıkladığınız için kullanılabilir olan tek sorundur. Diğer cevaplar OP'ye göre çok spesifiktir, ancak her durumun başka bir çözüme ihtiyacı vardır! Bana çok yardımcı oldu! –

+0

@AlBundy Im glad! – TechJS