Devasa dizinleri ilerleme raporuyla karşılaştırın


13

Bir RAID'den diğerine 2.000.000 dosyayı (3 TB) yeniden senkronize ettim.

Verilerimin sağlam olduğundan emin olmak istiyorum.

rsync -c çok uzun zaman alıyor.

diff bana ne yaptığını göstermiyor.

(A) Daha hızlı olan ve (b) karşılaştırırken bana ilerleme gösterecek bir alternatif var mı?

(Mac'liyim ve brew search diffbana apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... bunlardan biri işi yapar mı?)



Ayrıca rsyncverileri neden 150MB / s'de kopyaladığım konusunda kafam karıştı , ancak diffsadece 60MB / s'de karşılaştırıyor ...?
Dan

1
Kopyalama rsyncdaha hızlıdır b / c rsyncvarsayılan olarak dosyaları karşılaştırmak için sağlama toplamları kullanmaz, boyut ve tarih bilgilerine bakar. rsync -cTüm dosyaları kullandığınızda , sağlamalarının hesaplanması gerekir ki bu külfetli bir görevdir, bu yüzden neden varsayılan değildir.
slm

Evet, ancak diff kopyalamaz ... sadece her iki dosyayı da okur; rsync ise kopyalamak için her baytı okumalı ve yazmalıdır. Bu sıfırdan bir rsync idi, bu yüzden her dosyayı kopyalıyordu.
Dan

Yanıtlar:


6

düzeltme ve seçenek netliği için düzenle - '--brief' i unuttum

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

ve karşılaştırdıklarınıza bağlı olarak tadına bakmak için başka seçenekler ekleyin:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs, orijinal ve kopyadaki her baytı okur ve aynı olan dosyaları bildirir.

Diff çıkış formatı POSIX tarafından tanımlanır, bu nedenle oldukça taşınabilirdir. Şuna benzer bir şey eklemek isteyebilirsiniz:

| tee fark-1 | grep -v -Ee 'Dosyalar. * ve. * aynı'

Chksums veya karma kullanabilirsiniz, ancak daha sonra onları dosya ağaçları ile senkronize tutmak zorunda, bu yüzden her dosyanın her baytını okumaya geri dönecek.

DÜZENLEME - yorum yapmak için çok uzun, yanıt olarak:

10 GB üzerindeki dosyalar doğrulanmıyor

Bu fark seçeneğini denemek isteyebilirsiniz: --speed-large-files

Kullandığınız fark çok büyük dosyalarla (örneğin sistem belleğinden daha büyük) iyi başa çıkmıyor olabilir ve bu nedenle aslında aynı olan dosyalar arasındaki farkları bildiriyor olabilir.

Büyük dosyalarda daha iyi olan bir -h seçeneği veya bir 'bdiff' olduğunu düşünmüştüm, ancak Fedora'da bir tane bulamıyorum. --Speed-large-files seçeneklerinin '-h' "yarım yürekli karşılaştırma" seçeneğinin ardılı olduğuna inanıyorum.

Farklı bir yaklaşım, kullandığınız rsync komutunu '-vin' (ayrıntılı, itemize, no_run) ile tekrarlamak olacaktır. Bu, rsync'in bulduğu farklılıkları bildirir - ve olmamalıdır.

Bazı dosyaları taşımak için bir komut dosyasına şöyle bakıyorsunuz:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

ama bunu tavsiye etmiyorum. Temel soru, "rsync'in bir dosya hiyerarşisini doğru bir şekilde kopyaladığından nasıl emin olabilirim?" ve rsync'in diff veya başka bir araçla iyi çalıştığını kendinize gösterebiliyorsanız, o zaman onun etrafında çalışmak yerine rsync'e güvenebilirsiniz.

rsync -vin, verdiğiniz diğer seçeneklere göre karşılaştırır. Ben varsayılan olarak sağlama toplamı olduğunu düşündüm, ama haklısın, bunun için -c veya --checksum gereklidir.

Diff yardımcı programı gerçekten metin satırlarının dosyaları için tasarlanmıştır, ancak ikili dosyalar için 'özdeş' altında -s bildirmelidir.

--Brief herhangi bir dosya içeriği çıktısını bastırmalıdır - daha önce göz ardı ettiğim için özür dilerim - çirkin bir senaryoda yarı gömüldü.


Bu nedenle almak için bir yol var mı mvtam yolunu koruyarak sürücünün kökünde bir "doğrulanmış" klasörüne bulduğu her dosya? Örneğin, /disk1/a/b/c/file1aynıysa /disk2/a/b/c/file1, konumuna taşıyın /disk1/verified/a/b/c/file1. Sonra sadece kötü kopyalanmış dosyaları ile sonuçlanabilir. (Şimdiye kadar 10GB'ın üzerindeki LOTS dosya doğrulanmıyor, bu korkutucu.)
Dan

Bu seçeneği denemek isteyebilirsiniz: - hızlı-büyük dosyalar
D McKeon

Bu tam olarak ne yapıyor?
Dan

Çalıştırırsam rsync -vin- byte-byte-byte veya checksum karşılaştırması yapar mı? Ben eklemeden rsync sadece boyut / tarih karşılaştırıldı düşündüm -c. Ve okuduğum speed large fileskadarıyla sadece ikili olmayan dosyalar ile bir fark yaratıyor gibi görünüyor ... yoksa yanılıyor muyum?
Dan

diffbana "Files __ and ___ differ"... şeklinde sonuçları verir ve ben sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"kötü dosyaları yeniden kopyalamak için bir komut dosyası oluşturmak için denemek çalışıyorum. Ancak diff'in çıktısı tırnaksızdır, bu yüzden çalışmaz. Alıntılanan yolları bana verebilir miyim?
Dan

4

İşte diffdosya sayısına dayalı ilerleme raporu:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Pv'ye (boru görüntüleyici) ihtiyacınız olacak: http://www.ivarch.com/programs/pv.shtml

Açıklama:

  • diff -r dizin ve alt dizinleri özyinelemeli olarak karşılaştırabilir.
  • diff -qyalnızca dosyaların dosya adlarını yazdırır. gerçek farkları yazdırmayın.
  • diff -sayrıca farklı olmayan dosyaların dosya adlarını da yazdırır. bu ilerleme bilgileri için önemlidir.
  • pv -l satır sayısına göre ilerleme durumunu bildirme.
  • pv -s count sayıma dayalı olarak tamamlanma süresini tahmin edin.
  • Yönlendirme logfilegüzel çıktı içindir. Aksi takdirde, 'den çıktı, diffdurum satırı ile karışacaktır pv.

dosya sayısını almak için aşağıdaki komutu kullanın:

find dir1 -type f | wc -l

Farklı dosyalar için günlük dosyasına filtre uygulayın:

grep -v "^Files .* identical$" logfile

Bu varyasyon, gerçek zamanlı olarak farklı olan dosyaları yazdırırken aynı zamanda her şeyi oturum açacaktır logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Alternatif olarak, yalnızca farklı dosyaları günlüğe kaydedebilirsiniz:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Not: yukarıdaki komutlar dosya sayısına bağlı olarak ilerlemeyi rapor edecektir. Çok sayıda ufacık dosya varsa bu en iyi sonucu verir. Birkaç büyük dosyanız varsa, bununla çok eğlenmeyeceksiniz.

Ne yazık ki, karşılaştırılan baytlara göre ilerlemeyi rapor etmenin kolay bir yolunu bilmiyorum.


Huzurunuzu sadece meta verileri (dosyaların gerçek içeriğini değil) karşılaştırarak bulabilirseniz, rsync kullanabilirsiniz. Bu çok daha hızlı olacak.

Daha fazla ayrıntı için:


0

Veri bütünlüğünü kontrol etmek için karma uygulama bir tür kullanarak bakmak istiyorum. Birçok yinelenen dosya bulma yardımcı programlarının yinelenen / yinelenmeyenleri tanımlamak için karma kullandığını biliyorum. Bana bunun değerli olabilecek bir soruşturma olduğunu söylüyor.


0

Bunun için rdiff-backup kullanabilirsiniz . Her iki sunucuya da yükleyin ve sağlama toplamlarını akıllı karşılaştırmalar yapar ve henüz orada olmayanları senkronize eder.

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.