rsync: izinleri olmayan dosyaları atla


16

rsync -rlptDBaşka bir kullanıcıdan bir dizin kopyalamak için kullanıyorum . Kopyalama iznim olmayan birkaç dosya var (bunları önceden bilmenin bir yolu yok). Rsync bunları görmezden gelmek bir yolu var mı. Sorun şu ki, rsync sıfırdan farklı olursa, bash -x betiğim çıkacaktır.


Rsync iyi belgelenmiş çıkış değerlerine sahiptir. Durumunuz bir başarısızlık olmasını gerektirmiyorsa, hepsine başarısızlık olarak davranmamalısınız.
— jordanm

@jordanm Ancak yalnızca bu hatayı saptamak için yeterince belirgin bir hata kodu yok.
— Gilles 'SO- kötü olmayı bırak

Yanıtlar:


7

Rsync'in bunun için bir seçeneği yok. İki çözüm görüyorum. Bunlardan biri rsync hata mesajlarını ayrıştırmaktır; bu çok sağlam değil. Diğeri, filtrelenecek okunamayan dosyaların bir listesini oluşturmaktır.

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

Eğer findsahip değilseniz -readableve -executableuygun -permdirektifle değiştirin.

Bu, adı bir satırsonu içeren okunamayan dosyalar olmadığını varsayar. Bunlarla başa çıkmanız gerekiyorsa, bu şekilde boş bir dosya listesi oluşturmanız ve -0seçeneği aşağıdaki gibi iletmeniz gerekir rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

Bu muhtemelen onun en iyi bahsi. Umarım, sadece bir kez çalıştırması gerekir, çünkü stat()her dosyaya iki kez sahip olmak (bir kez rsync aracılığıyla ve bir kez bulmak yoluyla) oldukça kötü olurdu.
— jordanm

@Gilles bu gizli dosyalar dışında çalışıyor gibi görünüyor. Aynı stratejinin bazı küçük değişikliklerle çalışacağını varsayıyorum. \! (ünlem işareti) açıklayabilir misiniz?
— JeffCharter

1
@JeffC \!, !operatörü kabuk genişletmesine karşı korumak için alıntı yapar . Burada ters eğik çizgi gerekli değildir, çünkü kabuk !bir boşluk izlediğinde genişlemez , ancak incinmez. Gizli dosyalarda sorun nedir?
— Gilles 'SO- kötü olmayı bırak'

3

Bu özel durum için basit bir geçici çözüm yaptım:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

Bu 0, döndürülen kod 0 veya 23 ise döndürür ve diğer tüm durumlarda çıkış kodunu döndürür.

Bununla birlikte, koddan çıkan her şeyi yakalayacağından , bunun yalnızca izin olanları değil, tüm Partial transfer due to errorhataları göz ardı edeceğini unutmayın 23. Rsync durum kodları hakkında daha fazla bilgi için lütfen bu bağlantıya bakın .

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.