Rsync: yalnızca zaman damgalarının üzerinden kopyalama


42

Şu anda, zaman damgası hariç, her bakımdan aynı olan iki A / ve B dizinine sahibim. Bu nedenle eğer komutu çalıştırırsam:

rsync --dry-run -crvv A/ B/

sonra tüm dosyalar "güncelleme" olarak işaretlenir, oysa komut:

rsync --dry-run -rvv A/ B/

tüm dosyaların A / B / B'ye kopyalanacağını gösterir.

Benim sorum şudur: dosyaların aynı olduğunu (içeriğe göre) bildiğimi bildiğim halde, B / deki dosyaların zaman damgalarını, / içindeki dosyaların zaman damgalarıyla aynı olacak şekilde ayarlamanın bir yolu var (rsync veya başka bir yolla). A /, A / dan B / 'ye tüm dosyalar üzerinde kopyalanmadan?

Teşekkürler


Dosyaların özdeş olduğunu biliyorsanız, neden istediğiniz tarih / saat damgasını almak için kopyalamıyorsunuz?
Tim

3
@Tim: Belki de çok fazla veri var.
Richard,

Yanıtlar:


75

Kullanma -t(zaman damgalarını koru) ve --size-onlyyalnızca dosyaları boyutta karşılaştıracaktır. Boyut eşleşirse, rsync dosyayı kopyalamaz, ancak -tbelirtildiğinden, hedef dosyadaki zaman damgasını yeniden kopyalamaksızın günceller.

-uZaten varolan dosyaları atlayacağından ve zaman damgasını güncellemeyi tamamen atlayacağından (güncelleme) kullanmadığınızdan emin olun .

Başlangıçta bir sürü dosyayı yeni bir sürücüye kopyalamak için rsync kullanmama sorunum vardı ve bu nedenle zaman damgaları şimdiki zamana göre güncellendi. Her şeyi makul bir sürede doğru bir şekilde senkronize etmek için aşağıdaki komutu kullandım:

rsync -vrt --size-only /src /dest

2
Ayrıca --existing, yeni dosyaların yanlışlıkla kopyalanmasını önlemek için eklemenizi de öneririm .
leden

1
Bayrak --archive(veya -a) -r, -tve daha fazlasını içerir :)
Dor

6

-Size-only kullanmak, boyutlar eşleşiyorsa rsync'in dosya zaman damgalarını (ve dolayısıyla dosya içeriğini) karşılaştırarak atlamasına neden olur. Bunu --times ile birleştirmek zaman damgalarını hedef ağacın karşısına klonlar.


3

Rsync'in bunu yapmak için doğru araç olduğunu düşünüyorum, ancak bunu yapmak için bir komut dosyasının daha iyi bir başlangıç ​​yapmasını istiyorsanız.

Bunun gibi zaman damgaları (erişim zamanları) içeren bir dosya listesi alabilirsiniz:

find . -printf '"%p" %a\n' -type f > /tmp/times

Ve uygun zaman güncelleme komutlarını ondan alın:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

Tam bir senaryo değil, iyi bir başlangıç! :)


Teşekkürler. Sanırım şu an için Rsync'e bağlı kalacağım, ancak kesinlikle web'e çıkacağım ve gelecekteki yararlı olabileceği için betiğinizin farklı bileşenlerini öğreneceğim.
artella

Bu tam olarak benim çözümüm gibiydi! Müzik arşivime bazı meta veriler eklerken süreleri korumak istiyorum. Ancak, görünüşe göre dosya isimlerindeki boşlukları
kullanamıyor

2

Kullanım kaynak (örneğin /path/to/sourcedokunmatik komutu için referans olarak) dizini. Sadece cdsizin için hedef dizini ve do

find -type f -exec touch -r /path/to/source/{} {} \;

Alt saniye zaman damgalarını rsync ile (henüz) kopyalayamazsınız.

Bu aynı zamanda dizinler ve sözde dosyalar için de geçerlidir (sadece kaldırmak veya değiştirmek -type f)


Bu, kopyalanacak atime ihtiyaç duyduğum için benim için yararlı oldu. Benim durumumda iyi olan ctime kopyalanmadığını fark ettim.
snapfractalpop

Sadece 'dokunma' sayfasını oku. Atime ve mtime öğelerini bu komutla ayarlayabilirsiniz.
knorke

Evet, kullanabileceğini biliyorum touch -arama bu hala ctime değişmiyor. Sanırım bu nadiren isteniyor.
snapfractalpop

Ah, şimdi sorunu görüyorum. Teşekkürler. Evet, ctime'ın değiştirilmesi zor ve nedenini bilmiyorum.
knorke

1

Eh, kesinlikle bir taraftan zaman damgasını okuyan ve diğer tarafta aynı dosyayı ayarlamak için dokunuş kullanan bir senaryo yazabilirsiniz.

Ancak bu, rsync'in tüm dosyaları kopyalamaya çalışmasına izin vermekten çok daha uzun sürecektir. Çok az veri gerçekte aktarılacaktır (sadece dosyalar gerçekten özdeş ise sadece hash'leri engeller). Ancak her dosyanın tam içeriği en azından her iki tarafta da okunmalıdır. Yani, disk bant genişliği veya IOPS ile sınırlıdır, bu işlem biraz zaman alabilir. Ama yine de bir senaryo yazıp test etmekten daha az zaman alıyor.


Teşekkürler, rsync'in bu özelliğinden haberdar değildim (wikipedia'da da tartışılıyor).
artella

0

Benim gibi dosyaları değiştirmek isteyen ve orijinal zaman damgasını korumak isteyen insanlar için (örneğin, müzik kitaplığınızın meta etiketlerini güncellersiniz).

Stone tarafından sağlanan çözüme dayanıyor. Ancak, burada değişiklik zamanı ve zaman damgasını geri yüklemek için çalışan bir komut dosyası hakkında. İLK bir adım yapın, ardından dosyalarınızla çalışmaya başlayın.

  1. Eski zaman damgalarını koru . Geçerli dizinden çalışır, tüm gizli dosyaları hariç tutar ve içindeki geçici dosyaya kaydeder /tmp/files. Parametreleri her zaman değiştirebilirsiniz, ancak -printf '"%t" "%p"\n'sonraki touchkomut bunu kullandığından beri daha iyi kalın .

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. Dosyalarınızı istediğiniz kadar değiştirin

  3. şimdi zaman damgalarını geri yüklemenize yardımcı olan bir dosya oluşturun:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. Ve nihayet eski tarihleri ​​değiştirilen dosyalara uygulayın.

    sh job.sh

Uyarma: ad aralığı olan dosyalar, özel karakterler için çalışır, ancak $içinde işaretli dosyalar yoktur .


Dosya adlarınızdaki ters eğik çizgilerle ilgili sorunlardan kaçınmak için kullanın read -r line. Eh, her zaman kullanmak readile -r. Ayrıca, job.shher bir dosya için açılmasını önleyebilirsiniz . Yönlendirmeyi komutun sonuna koyun:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

2. Uyarı: Bu komut dizini zaman damgalarını aktarmaz. (Peki, OP bunun için sormadı.)
22'deki hagello

0

Windows'ta yalnızca zaman damgasını kopyalamanın en iyi yolu:

Herhangi bir dosyanın en son oluşturulan / değiştirilen / erişilen zaman damgasını bir başkasına kopyalamak için, şunları kullanabilirsiniz:

/ c / m / a / r öğesine dokunun SourceFile DestFile

(Bu Touch sürümü, http://www.stevemiller.net/apps/ adresindeki Win32 Console ToolBox'un bir parçasıdır )

"SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / TELİF / DCOPİ: DAT / XF . / R: 10 / W: 5 / V / ETA


-1

Rsync manual: man rsynca -tve -Nswitch'i listeler , uğraşmaya değer olabilir.


Göremedim -N. Bunları neden yine de tavsiye edersiniz?
Tom Hale
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.