Bir klasörde MD5 (veya benzeri) var mı? İki klasörün eşit olup olmadığını nasıl kontrol edebilirim?


10

md5sumBir klasörü bir arşive sıkıştırmadan bir (veya benzer bir hesaplama) bulmak istiyorum .

Örneğin, klasördeki eğer MyFolderbiz dosyaları var 1.txt, 2.txtve 3.txt, içeren:


1.txt

1.txt içindeki metin

2.txt

2.txt içine metin

3.txt

3.txt içine metin


Nasıl hesaplayabilirsiniz md5sumbu bütünün MyFolder? Bir yolu var mı? İki klasörün aynı içeriğe sahip olup olmadığını doğrulamak için bunu kullanmak istiyorum.

Bu, iki cd veya klasörün eşit olup olmadığını doğrulamak için kullanılabilir. Bunu yapmanın kolay bir yolunu istiyorum.

Yanıtlar:


15

Md5deep aracı tam da bu amaç için geliştirilmiştir. Birçok Linux dağıtımı bunu paket biçiminde sunar.


1
Teşekkür! Bana iyi geldi. Aynı sorunu yaşayan diğer kullanıcılara: Bunu sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory çok seviyorum: Çok teşekkürler.
GarouDan

@GarouDan. Gösterdiğiniz komut sembolik bağlantıları takip edecektir. -oDosya türlerini işlemek için bu seçeneği kullanabilirsiniz .
Peter.O

Oh thx ... bilmiyorum ... gerçekten yardýmcý. Hatırlayacağım!
GarouDan

4

Arşivlemek istemiyorsanız, belki böyle bir şey yapabilirsiniz

diff <(find folder1) <(find folder2)

findDaha doğru olması için komutları uyarlamanız gerekebilir .

EDIT-exec Dosyaların içeriğini karşılaştırmak için arama çağrınıza ekleyebilirsiniz . Buna benzer bir şey:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Bunu uyarlamak isteyebileceğinizi unutmayın.


Bu ilginç bir nokta. Bu, her klasörün tüm dosyalarını listeler ... ama gerçekten çok fazla arşivim varsa ... her klasörde aynı dosyaların (verilerle - belki bir md5sum aracını kullanarak) olduğunu nasıl doğrulayabilirim?
GarouDan

1
Sonra her dosyanın MD5SUM çıkışının bir farkını yapın. Sadece find, md5sum ve diff komutlarını farklı bir şekilde dizmeniz yeterlidir.
sybreon

Fikirleriniz için de teşekkürler, cya ... Bu bulma komedisi ile ilginç şeyler deneyeceğim ... teşekkürler.
GarouDan

3

Test etmenin bir yolu, klasördeki ve alt klasörlerindeki tüm dosyaların birleştirilmesine dayalı olarak bir md5sum oluşturmak olabilir. Bunun dosyaların aynı adlara sahip olmasını gerektirdiğini unutmayın (aynı sıralama düzeninde olmaları gerektiği için). Aşağıdaki kod çalışmalıdır:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Eğer gerçekten vb dosya adları, umurumda varsa, içinde ne karşılaştırmak için bir döngü kullanabilirsiniz ${_files_in_old_dir}ve ${_files_in_new_dir}. Bu, çoğu durumda işe yarayacaktır (en azından dir ve alt dizinlerindeki dosya sayısını kontrol eder).


Bu güzel bir senaryo ... thx @Chris. Ama bir problemi var ... kedi kullanarak , alt klasörler hatalarla çöküyor ... Çözecek bir fikrin var mı? Çok teşekkürler.
GarouDan

Benim için iyi çalışıyor. Kabuğunuzun desteklediğinden emin olun globstar. Hata nedir?
Chris Down

1
"Çalışır" (+1) ... ancak bash 4'teki globstar dizin simgelerini izler , ancak bu yalnızca bir dizinden bir symlink içeriyorsa bir sorundur.
Peter.O

@fered İyi arama, bir teste ekledim.
Chris Down

0

Orijinal gönderinin oldukça eski olduğunu fark ettim, ancak bu bilgilerin yine de dosyaların doğru kopyalandığını doğrulamak için bir çözüm arayanlar için değerli olabileceğini düşünüyorum. Rsync veri kopyalamak için en iyi yöntem olabilir ve bu konuda verilen cevaplar iyi, ancak Linux ile deneyimli olmayanlar için daha ayrıntılı bir açıklama yapmaya çalışacağım.

Senaryo: Verileri bir diskten diğerine, birçok alt dizin ve dosya ile kopyaladınız. Tüm verilerin doğru kopyalandığını doğrulamak istiyorsunuz.

Önce komutu vererek md5deep'in kurulu olup olmadığını kontrol edin md5deep -v.

'Komut bulunamadı' gibi bir mesaj alırsanız, md5deep by yükleyin apt-get install md5deep.

Yalnızca normal dosyalarla uğraşmak istediğiniz varsayılmıştır. Diğer dosya türleriyle ilgilenmek istiyorsanız, md5deep kılavuzundaki -o bayrağına bakın. ( man md5deep)

Şimdi gitmek için iyi, ve biz size dosyaları kopyaladığınız varsayalım /mnt/orginaliçin /mnt/backup, kullandığınız herhangi dizinler için bu yerine.

İlk olarak kaynak dizini değiştirin, kopyaladığınız veya yedeklediğiniz dosyaların orijinal kaynağı budur:

cd /mnt/orginal

Ardından her dosyanın bir sağlama toplamını yapın:

md5deep -rel -o f . >> /tmp/checksums.md5

Bu komut açıkladı:

-r özyinelemeli modu etkinleştirir

-e ilerleme göstergesi görüntüler

-l göreli dosya yollarını etkinleştirir.

-o f yalnızca normal dosyalar üzerinde çalışır (cihazları engelle, adlandırılmış yöneltmeler vb. değil)

. md5deep'e geçerli dizinde başlamasını söyler.

>> /tmp/checksums.md5md5deep'e tüm çıkışı yönlendirmesini söyler /tmp/checksums.md5.

Not, önceki sürümlerinde içeriğin üzerine istiyorsanız /tmp/checksums.md5, kullanım >ve>>

İo hızına ve verilerin boyutuna bağlı olarak bu komutun biraz zaman alabileceğini unutmayın. Md5deep'in performansını artırmak için güzel ve / veya iyonik deneyler yapabilirsiniz, ancak bu, bu cevabın kapsamı dışındadır.

Çek toplamlarının oluşturulması tamamlandığında, artık aşağıdakine benzer girişlere sahip bir dosyanız var:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm1/9c9/9c9/9c9/9c9/9c9/9c9 /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

İlk sütun md5 denetim toplamı ve ikinci sütun sağlama toplamının ait olduğu dosyaya göreli yoldur.

Sağlama toplamı dosyasında kaç dosya olduğunu görmek istiyorsanız, şu komutu verin:

wc /tmp/checksums.md5 -l

Şimdi, kopyalanan verilerin doğru olup olmadığını kontrol etmek istiyorsunuz:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

Sağlama toplamlarını oluşturduğumuzdaki tek fark, checksums.md5 dosyasındaki giriş eşleşmiyorsa bir dosyanın geçerli karmasını görüntüleyen -X'dir . Testin sonunda /tmp/compare.result, boşsa, sağlama toplamı eşleştiğinden tüm dosyaların doğru kopyalandığına güvenebilirsiniz.

Yalnızca dosyada listelenen dosyaların /tmp/checksums.md5doğru bir sağlama toplamı için denetleneceğini unutmayın, /mnt/backupdizinde başka dosyalar varsa , md5deep bunlar hakkında sizi bilgilendirmez.

Notlar:

  • Çıktı dosyalarını saklamak için yeniden yönlendirme kullanmak zorunda değilsiniz. Daha fazla bilgi için md5deep kılavuzuna bakın.

  • Kullandığınız dosyaların izinlerine bağlı olarak, md5deep komutlarını root olarak çalıştırmanız gerekebilir.


0

Eğer kontrol etmek isterseniz yinelemeli iki dizinleri arasındaki farkları /path1ve /path2 olmadan kullanarak md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Açıklama:

  • girdim path1tarafından basılan tüm satırlar yapmak findiçin göreli path1( cd /path1)
  • geçerli yolda tüm dosyaları özyinelemeli olarak listeler ( && find . -type f)
  • ( ) findiçin giriş olarak her satır çıkışını kullanmd5| xargs md5

Herhangi bir fark varsa çıktı şu şekilde görünecektir:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
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.