rsync: --size-only ve --ignore-times arasındaki fark


114

İki seçenek arasındaki farkın ne olduğunu anlamaya çalışıyorum

rsync --size-only

ve

rsync --ignore-times

Anladığım kadarıyla rsync, bir dosyanın senkronize edilip edilmeyeceğine karar vermek için varsayılan olarak hem zaman damgalarını hem de dosya boyutlarını karşılaştıracaktır. Yukarıdaki seçenekler, kullanıcının bu davranışı etkilemesine izin verir.

Her iki seçenek de en azından sözlü olarak aynı şeyle sonuçlanıyor gibi görünüyor: yalnızca boyuta göre karşılaştırma .

Burada ince bir şey mi kaçırıyorum?


18
Bu, kod yazmakla doğrudan ilgili herhangi bir şeyden ziyade var olan (programlamayla ilgili olmayan) bir aracı kullanmakla ilgili olduğundan , SuperUser.com veya Unix.SE gibi bir şeye muhtemelen daha iyi uyacaktır .
Jerry Coffin

Yanıtlar:


110

Rsync'in dosyaları karşılaştırmasının birkaç yolu vardır - yetkili kaynak, rsync algoritması açıklamasıdır: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Wikipedia makale rsync da çok iyidir.

Yerel dosyalar için rsync, meta verileri karşılaştırır ve dosyayı kopyalamaya gerek yok gibi görünüyorsa, boyut ve zaman damgası kaynak ile hedef arasında eşleştiği için daha fazla görünmez. Eşleşmiyorlarsa, dosya cp'dir. Bununla birlikte, meta veriler eşleşiyorsa ancak dosyalar aslında aynı değilse ne olur? Sonra rsync muhtemelen amaçladığınız şeyi yapmadı.

Aynı boyuttaki dosyalar yine de değişmiş olabilir. Basit bir örnek, bir yazım hatasını düzelttiğiniz metin dosyasıdır - "teh" kelimesini "the" olarak değiştirmek gibi. Dosya boyutu aynı, ancak düzeltilen dosyanın zaman damgası daha yeni olacak. --size-only"zamana bakmayın; boyut eşleşmeleri dosyaların eşleştiğini varsayarsa" diyor, bu durumda yanlış seçim olur.

Öte yandan, cp -r A Bdün yanlışlıkla büyük bir şey yaptığınızı , ancak zaman damgalarını korumayı unuttuğunuzu ve şimdi işlemi tersine yapmak istediğinizi varsayalım rsync B A. Cp'ladığınız tüm bu dosyalar, dün gerçekten değiştirilmemiş olsalar bile dünün zaman damgasına sahiptir ve rsync varsayılan olarak tüm bu dosyaları kopyalayacak ve zaman damgasını da düne güncelleyecektir. --size-onlybu durumda arkadaşınız olabilir (yukarıdaki örnek modulo).

--ignore-timesdosyaların aynı değişiklik zamanına sahip olup olmadığına bakılmaksızın dosyaları karşılaştırmak için diyor. Yukarıdaki yazım hatası örneğini düşünün, ancak o zaman sadece yazım hatasını düzeltmekle kalmadınız touch, aynı zamanda düzeltilmiş dosyanın orijinal dosyayla aynı değişiklik zamanına sahip olmasını sağladınız - sadece bu şekilde sinsi olduğunuzu varsayalım. Eh --ignore-timesdosyaların bir diff yapacak olsa boyut ve zaman maç.


58

Kısa cevap, --ignore-timesisminin ima ettiğinden daha fazlasını yaptığıdır. Hem zamanı hem de boyutu görmezden gelir . Aksine, --size-onlytam olarak ne diyorsa onu yapar.


Uzun cevap, rsyncbir dosyanın güncel olup olmadığına karar vermenin üç yolu vardır:

  1. Kaynak ve hedefin boyutunu karşılaştırın.
  2. Kaynak ve hedefin zaman damgasını karşılaştırın.
  3. Kaynak ve hedefin statik sağlama toplamını karşılaştırın.

Bu kontroller, veri aktarılmadan önce gerçekleştirilir. Özellikle, bu, statik sağlama toplamının akış sağlama toplamından farklı olduğu anlamına gelir - daha sonra veri aktarılırken hesaplanır.

Varsayılan olarak, rsyncyalnızca 1 ve 2'yi kullanır. Hem 1 hem de 2, tek bir kişi tarafından birlikte alınabilirken stat3, tüm dosyanın okunmasını gerektirir (bu, aktarım için dosyayı okumaktan bağımsızdır). Yalnızca bir değiştiricinin belirtildiğini varsayarsak, bu şu anlama gelir:

  • Kullanılarak --size-only, yalnızca 1 gerçekleştirilir - zaman damgaları ve sağlama toplamları göz ardı edilir. Bir dosya, boyutu her iki ucu da aynı olmadığı sürece kopyalanır.

  • Kullanılarak --ignore-times1, 2 veya 3'ün hiçbiri gerçekleştirilmez. Bir dosya her zaman kopyalanır.

  • Kullanılarak --checksum, 3 kullanılan ek 1, fakat 2 olduğu değil gerçekleştirilir. Boyut ve sağlama toplamı eşleşmediği sürece dosya kopyalanır. Sağlama toplamı yalnızca boyut eşleştiğinde hesaplanır.


1
--checksum tam olarak aradığım şeydi. Dosyaların çoğu için yalnızca zaman değişikliği olan derleme çıktısını kopyalıyordum. --Checksum eklenmesi, zaman farklarını yok saydığı, ancak bit bitimiyle aynı olduklarından emin olduğu anlamına geliyordu. Beklediğim bir şeydi - çok kez yapmasını, ek bilgi için teşekkür ederim.
Joseph Connolly

50

Rsync'in dosyaları sağlama toplamına göre de karşılaştırabileceğini kaçırıyorsunuz.

--size-onlyrsync'in zaman damgaları farklı olsa bile boyut olarak eşleşen dosyaları atlayacağı anlamına gelir. Bu, varsayılan davranıştan daha az dosyayı senkronize edeceği anlamına gelir. Genel dosya boyutunu etkilemeyen değişiklikler içeren tüm dosyaları gözden kaçırır. Dosyaları değiştirmeden dosyalardaki tarihleri ​​değiştiren bir şeyiniz varsa ve rsync'in bu dosyaların değişmediklerini keşfetmek için çok fazla zaman toplamasını istemiyorsanız, kullanma seçeneği budur.

--ignore-timesrsync'in zaman damgaları ve dosya boyutları eşleşse bile her dosyayı kontrol edeceği anlamına gelir. Bu, varsayılan davranıştan daha fazla dosyayı senkronize edeceği anlamına gelir. Dosya boyutunun aynı olduğu ve değişiklik tarihinin / saatinin orijinal değerine sıfırlandığı durumlarda bile dosyalardaki değişiklikleri içerecektir. Her dosyanın sağlama toplamı, tamamen diskten okunması gerektiği anlamına gelir ve bu yavaş olabilir. Bazı derleme ardışık düzenleri, son derleme dosyasının bit bit çoğaltılabilir olmasını sağlamak için zaman damgalarını belirli bir tarihe (1970-01-01 gibi) sıfırlar, örneğin, zaman damgalarını kaydeden bir tar dosyasına paketlendiğinde.


4
"Tarih / saatin sıfırlanması pratikte pek olası değildir, ancak olabilir" - Örneğin, yeniden üretilebilir yapılar adına her dosyayı zorla tarih ve tarih yerine 1970-01-01'e sıfırlayan bir yazılım kullanılırken fiili yaratma / değiştirme zamanı.

10
Aslında, sağlama toplamlarının kullanılmasını istiyorsanız -c seçeneğine ihtiyacınız olduğunu düşünüyorum. Onsuz, --ignore-times tüm dosyaları koşulsuz olarak kopyalayacaktır.
Edward Falk

1
-A seçeneği bu seçenekleri geçersiz kılabilir. Benim durumumda --compare-dir = ve --size-sadece kullanıyordum ve beklenmedik sonuçlar alıyordum. -A'yı -r olarak değiştirmek sorunu çözdü.
dbagnara

@dbagnara Bugün --size-sadece "" -a "veya" geçersiz kılmalar "-a'nın üstüne oturduğunu doğruladım. Her ne sebeple olursa olsun, tüm modifikasyon süreleri bir ay artan bir sürücüm vardı. Yedeklemeye Rsync her dosyayı kopyalıyordu (-a AÇIK ile). Yalnızca -size-boyutunun eklenmesi sorunu çözdü ve istenen sonuçlara yol açtı (yani -a -size-sadece). Bu nedenle, yalnızca boyutun arşivi geçersiz kıldığı sonucuna vardım.
Tommy

1

Scientific Linux 6.7 sisteminde, rsync'deki man sayfası şunu söylüyor:

--ignore-times          don't skip files that match size and time

Aynı içeriğe sahip, ancak farklı oluşturma tarihlerine sahip iki dosyam var:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

İle --size-onlyiki dosya aynı kabul edilir:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

İle --ignore-times, iki dosya farklı kabul edilir:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Yani --ignore-timeshiçbir etkisi yok gibi görünüyor .


2
--ignore-timeszaman damgaları aynı olsa bile dosyaları kopyalayacaktı.
MisterMiyagi
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.