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.