Rsync neyi senkronize edeceğine tam olarak nasıl karar verir?


15

Soruya birden fazla cevap buluyorum, bu yüzden rastgele yarı yararsız bilgilerle doldurarak en büyük blogu yapmak yerine, gerçekten kullanan insanlara sormak istedim.

Senaryo: Ben rsync -av --progress /dir/a /dir/b ve onun işi var.

/ Dir / a dosyasına yeni dosyalar ekleyip aynı komutu tekrar çalıştırıyorum, ne yaptığını biliyor ve sadece yeni dosyaları kopyalıyor.

/ Dir / a dosyasına yeni dosyalar eklerim ve / dir / b içindeki bazı dosyaları yeniden adlandırırım ve birkaçını da silebilirim.

Koşarsam rsync -av --progress /dir/a /dir/byine ne kopyalanır? Sadece yeni dosyalar çünkü daha önce ne kopyaladığını biliyor ya da artık mevcut olmadığı için yeniden adlandırılan / silinen dosyalar da var.

Daha önce kopyalanan dosyalar Ve eğer bir bonus olarak, olan yine kopyalanamaz, bunu önlemek için bir yol sadece yeni eklemeler / dir / a kopyalanır için, böylece var?

Şu anda işleri manuel olarak kontrol etmekten mutluluk duyuyorum, ancak veriler büyüdükçe bu görevi gerçekleştirmek için daha fazla otomasyona ihtiyacım olacak.


3
-iBayrak çok kullanışlıdır. Her dosya için neden eşleştiğini görmek için kodu çözülebilen bir eşleşme dizesi verir (mod zamanı için bayrak, boyut için bayrak, vb.)
BowlOfRed

Yanıtlar:


17

/ Dir / a dosyasına yeni dosyalar ekleyip aynı komutu tekrar çalıştırıyorum, ne yaptığını biliyor ve sadece yeni dosyaları kopyalıyor.

Hayır, önceki bir koşuda ne yaptığını bilmiyor. Alıcı taraftaki verileri gönderilecek verilerle karşılaştırır. Yeterli küçük verilerle, bu belirgin olmayacaktır, ancak yeterince büyük dizinleriniz olduğunda, kopyalama gerçekten başlamadan önce karşılaştırılan zaman kolayca hissedilir.

Varsayılan kontrol, dosya değiştirme süreleri ve boyutları içindir. Gönderen man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

Ve:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Bunların kullandığınız seçeneklerle örtüşmediğini unutmayın. -adır-dir:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

Şimdiye kadar gördüğüm en iyi açıklama (şimdiye kadar), teşekkür ederim
SPooKYiNeSS

2
Biraz ekleme. Yeniden adlandırılan dosyalar her iki uçta da benzersiz dosyalar olarak kabul edilir. --fuzzyBir kez belirtilmesi , onları aynı dizinde aynı olarak tanıyacaktır. --fuzzyİki kez kullanmak bu özelliği diğer konumlara genişletir. Ayrıntılar man rsynciçin bakınız. Tabii ki, kullanımın ana nedenlerinden biri rsync, bir dosyanın yalnızca değişen bölümlerini kopyalama yeteneğidir. Bu, bir ağ üzerinden aktarımları çok daha hızlı hale getirebilir. BTW, sağlama toplamı seçeneğinin nasıl rsyncçalıştığına dair açıklaması için yukarıda belirtilmiştir . Çoğu durumda, kullanılmamalıdır.
Joe

6

Genel

Doğru anlıyorsam, rsync -avhafızam yok, bu yüzden yeniden adlandırılmış / silinmiş dosyaları kopyalayacak, çünkü bunlar kaynakta mevcut ancak artık hedefte mevcut değil.

İpuçları

  • Komut satırınızı -nçalıştırmadan önce ne olacağını kontrol etmek için 'kuru çalışma' seçeneğini kullanın rsync.

  • Kaynak dizinden sonraki eğik çizginin özel anlamına dikkat edin ve aralarındaki farkı görün

    rsync -av --progress dir/a/ dir/b
    

    ve

    rsync -av --progress dir/a dir/b
    

    bu kılavuzda açıklanmıştır man rsync.

Misal

Özel durumunuz ('a' kaynak dizinine bir dosya ekleme ve 'b' hedef dizininden bir dosya kaldırma) hem eklenen dosyayı hem de önceden kopyalanan dosyayı ekler, çünkü hala kaynak dizinindedir. Bu hem seçenekli hem de seçeneksiz olur ve bunu kaynak dizinde tutmak istiyorsanız, kolayca düzeltmek için -uherhangi bir seçenek bilmiyorum rsync.

Ancak bunu kaynak dizinden kaldırabilir veya dosya adını dosyaya koyabilir excludedve --exclude-from=excluded(birçok dosya için) seçeneğini veya yalnızca --exclude=PATTERNbir veya birkaç dosya için seçeneğini kullanabilirsiniz .

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternatif: unison

Senkronizasyon aracı unisonolan aracı test etmek isteyebilirsiniz . Özel durumları belirlemek ve ne yapılacağına karar vermek için görsel bir yöntem sağlar. Bir GUI sürümü ( ) vardır.unison-gtk


Güzel örnekler teşekkürler. Ben / sonunda bir şey biliyordum, ben sadece bu app soruyorum, ve kaçırdım (ve ben açıkça sadece kopyalanan / yayınlanan görebilirsiniz
SPooKYiNeSS

Ve yine bitirmeden önce gönderir ve yorumumu düzenlememe izin vermez ... İkincisini kopyaladım / yapıştırdım. Unuson'a bir göz atacağım ve istediğimi yapıp yapamayacağını göreceğim ve eğer değilse plan b'ye geri döneceğim ve sadece bir senaryo yapacağım
SPooKYiNeSS

unison-gtkBirkaç yıldır kullanıyorum ve bundan memnunum. (Ben de kullanıyorum rsync.)
sudodus

1

Yalnızca / dir / a içindeki yeni dosyaları kopyalar. /Delete seçeneğini kullanmazsanız / dir / b öğesinde yaptığınız her şey yok sayılır. Bu durumda, / dir / b içindeki yeniden adlandırılan dosyalar silinir. / Dir / b'yi tam olarak / dir / a gibi olmaya zorlar.

Bonus hakkında, / dir / a içindeki dosyaları yeniden adlandırma ve ardından / dir / b için rsyncing durumunda mısınız? Ben rsync sadece bu durumda dosyaları tekrar kopyalamasını önlemek için bir yol olduğunu sanmıyorum.


Belirlemek için bir öznitelik kullanmak dışında bir yol olmasını beklemiyordum, ama sonra bir çocuk senaryosu yapıyorsan ve artık ihtiyacım olurdu. Cevabınız için teşekkür ederim, en azından şimdi ne yapmam gerektiğini biliyorum.
SPooKYiNeSS
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.