Dosyaları senkronize etmenin en iyi yolu - yalnızca MEVCUT dosyaları ve yalnızca hedeften daha yeni olanları kopyalayın


18

Bu senkronizasyonu Ubuntu 12.04'te yerel olarak yapıyorum. Dosyalar genellikle küçük metin dosyalarıdır (kod).

Ben den (mtime damgası koruyarak) kopyalamak istediğiniz sourcedizine targetama sadece dosya halinde kopyalamak istediğiniz target zaten var ve bir yaşlı olandan source.

Bu yüzden sadece daha yeni olan dosyaları kopyalıyorum source, ancak içinde bulunmaları gerekiyor targetveya kopyalanmayacaklar. ( sourcebundan çok daha fazla dosya olacaktır target.)

Aslında sourcebirden fazla targetdizine kopyalama yapacağım . Çözüm seçimini etkilemesi durumunda bundan bahsediyorum. Ancak, komutumu birden çok kez çalıştırabilirim, targether seferinde yenisini belirterim , eğer gerekliyse.

Yanıtlar:


29

Bunu rsyncyapmak için kullanabileceğine inanıyorum . Anahtar gözlem --existingve --updateanahtarlarının kullanılması gerekir.

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

Böyle bir komut bunu yapar:

$ rsync -avz --update --existing src/ dst

Misal

Aşağıdaki örnek verilere sahip olduğumuzu varsayalım.

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

Hangi gibi görünüyor:

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

Şimdi bu dizinleri senkronize edecek olsaydım hiçbir şey olmazdı:

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

Daha touchyeni olması için bir kaynak dosyamız varsa :

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

rsyncKomutun bir başka çalışması :

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

Daha file3yeni olduğu ve içinde bulunduğundan görebildiğini görebiliriz dst/.

Test yapmak

Komutu gevşek kesmeden önce işlerin çalıştığından emin olmak için, rsync's anahtarlarının bir başkasını kullanmanızı öneririm --dry-run. Bir tane daha ekleyelim, -vböylece rsyncçıktısı daha ayrıntılı olacaktır.

$ rsync -avvz --dry-run --update --existing src/ dst 
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Teşekkür ederim. Birkaç rsync seçeneğine ihtiyacım yok mu? Adam sayfasını okuyorum. Buna ihtiyacım olabilir gibi görünüyor rsync --archive --update --existing --whole-file --itemize-changes a/ b. Yoksa bu seçeneklerin çoğu gereksiz mi? (Bunlar çoğunlukla küçük metin dosyaları olduğu için tüm dosyayı ekledim.)
Monica Cellio için MountainX

@MountainX - yalnızca ihtiyacınız olan seçenekleri ekleyin. Bu -abir anahtarlar kümesi ile başlıyorum -rlptgoD.
slm

Açıklığa kavuşturayım. Kafam karıştı --updateve --existing. İkisine de ihtiyacım var mı? Çözümünüzü test ettim ve işe yarıyor gibi görünüyor, ancak yine de eklemeyi daha güvenli hissediyorum --update.
Monica Cellio için MountainX

@MountainX - kesinlikle ekleyebilirsin, ben de A'ya koyacağım.
slm
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.