iki klasördeki dosyaların md5sum


1

Tüm dosyaları iki klasörde tek bir komutta md5sum aracılığıyla karşılaştırmaya çalışıyorum. Bazı Debian aşağıdaki (bash) gibi:

$ cd ~/FOLDER1
$ md5sum ~/FOLDER2/* | md5sum -c -

Buradaki fikir, ilk md5sum'dan gelen karma çıktısının ikinciye aktarılması ve girdi dosyası olarak kullanılmasıdır. Bununla birlikte, bunun test edilmesi FOLDER2'deki her bir dosyayı yalnızca kendiyle karşılaştırdığını ve her biri için "Tamam" ı döndürdüğünü gösterir. Bunun çalışmamasının sebebinin, ilk md5sum'dan çıkan dosya adlarının tam yolu içermesi olduğunu düşünüyorum. Baktım md5deepama orada bana yardım edecek hiçbir şey bulamadım. Bir klasör için md5sum yapmanın, sonuçları bir dosyaya yazmanın ve ikinci md5sum için girdi olarak kullanmanın mümkün olduğunu biliyorum. İki komut kullanmak ve bir dosya yazmak yerine, hepsini bir satırda bir satırda yapmak istiyordum.

Düzenleme: Burada (kullanarak diff) kabul edilen cevap istediğimi yapabilir, ancak diff(doğru) ikili dosyaları karşılaştırır mı bilmiyorum .

Düzenleme: md5sum kullanarak kullanmak istediğim çıktıyı aldım (dosya adını ve "Tamam" ı gösterir), bir toplu iş dosyası yazmaya başladım. İle yürütün diffFolders.sh ~/FOLDER1 ~/FOLDER2.

#!/bin/bash
HERE=$PWD
cd "$1"
md5sum * > /tmp/md5sum.cmp
cd "$2"
md5sum -c /tmp/md5sum.cmp
cd $HERE

Bu komut dosyası yalnızca içinde bulunan dosyaları karşılaştırır ~/FOLDER. Eğer ~/FOLDER2ek dosyalar varsa , bunlar karşılaştırılmayacak ve çıktılar bile var olduklarını göstermeyecektir.

Yanıtlar:


2

Diferansiyel olarak 2 md5sumun çıktısını geçmek için proses ornatımını kullanabilirsiniz . Bu durumda farklı olabilir çünkü md5 çıktıları düz metindir. Gibi bir şey:

diff <(md5 ~/FOLDER1/* | awk '{print $4}') <(md5 ~/FOLDER2/* | awk '{print $4}')

Üzgünüm, burada Debian yok ve bunu test edemiyorum. Yukarıdakiler çıktı bakımından biraz farklı olabilen md5'e sahip OS X üzerinde test edilmiştir. OS X'te md5'in 4. sütunu gerçek md5 toplamıdır, bu yüzden sadece bu sütunları alıyorum.

Awk yerine de kullanabilirsiniz cut, ancak dördüncü sütunu almak için ayırıcıyı değiştirmeniz gerekebilir (bunlar sekmeyle ayrılmış değildir).


Teşekkürler. Bu oldukça iyi çalışıyor, çıktılarını nasıl yorumlayacağınızı bildiğiniz sürece diff, bu beni biraz zaman aldı :) Debian'da komut md5sumve gerçek karma sütun 1'de.
SabreWolfy

0

Biraz uzun ama dosya ismini döndürür ve eğer eşleşirse Tamam. '-C' kullanmak yerine, her iki klasördeki md5sum dosyasını çalıştırmaktan çıkan iki dizge çıktısını karşılaştırmak yeterlidir.

for f in *; do [[ -f $f ]] && if [ $(md5sum "$f" | cut -d" " -f1) == $(md5sum dir2/"$f" | cut -d" " -f1) ]; then echo "$f" "OK"; else echo "$f" "MODIFIED"; fi; done

0

.Bashrc dosyamdan.
çok eski şeyler , çok sıralayıcı koduyla yazmak mümkün olmalıdır. Bunu yazmak için asla bulamadım. (geçici bir düzeltme için kullanılan her şey gibi, sonsuza dek kullanılmış) Bu utanç verici kod parçasını gönderiyorum, umarım biri daha iyisini yapabilir ve sonucu gönderebilir :-)

Özellikleri :

  • Recrusive dir enine
  • md5sum benzersiz / farklı olup olmadığını denetle
  • Güncellenen dosyaları tam yolunda listeler

Kod her şeyi söylüyor. arg1 eski dir, arg2 yeni dir.

function find-updated-files-between-old-new(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( ( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n")
 )|sort -k1.2|tee 1>/dev/null >(uniq -us1|awk -v B="$2" 'BEGIN{sub("/$",""B)}/^-/{print B substr($0,3);
 }') >(uniq -ds1|awk -vA="$1" -vB="$2" 'BEGIN{B=g(B);A=g(A)}{
 C=substr($0,3);if(f(A)!=f(B))print B C;}function g(y){sub("/$","",y);return y}
 function f(y,z,e){e="md5sum \""y""C"\"";e|getline z;close(e);return substr(z,1,32)}' )
 ) | cat
}

İşlev adından da anlaşılacağı gibi

function find-files-name-collision-between-dir1dir2(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." > /dev/stderr && return 1;
( cat <(cd "$1";find . -type f -printf "+%p\n") <(cd "$2";find . -type f -printf "-%p\n") )|sort -k 1.2 | uniq -d -s 1
}

Sadece bütünlük için

function mv-mergedir1todir2(){
 [ ! -d "$1" ] || [ ! -d "$2" ] && echo "*** Error: The directory is not found." && return 1;
 ( cd "$1" ; tar cf - . ) | (cd "$2" ; tar --keep-old-files xvf - )
 echo -e "Done. Duplicate filnames are not replaced. \n#Use \n# ( cd \"$1\" ; tar cf - . ) | (cd \"$2\" ; tar --overwrite xvf - ) \n#if you do not like that. "
}

Bu korkunç kod, bashrc’imden kaldırılmalı, fakat uzun zamandır ...


Çalışıyor mu? Bu, sorunun cevabını mı kastediyor, yoksa kod hakkında geri bildirim mi istiyorsun?
SabreWolfy,
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.