2011-05-18 20 views
14

2 dosya aldım. Onları md5s1.txt ve md5s2.txt olarak adlandıralım. Her ikisi de farklı dizinlerde birher satırın yalnızca ilk n karakterini karşılaştıran fark dosyaları

komutunu içerir. Birçok dosya yeniden adlandırıldı, ancak içerik aynı kaldı. Bu nedenle, aynı md5sum olmalıdır. Ben

diff md5s1.txt md5s2.txt 

gibi bir diff üretmek istiyorum ama her cümlenin ilk 32 karakteri, yani sadece md5sum değil, dosya adı karşılaştırmak gerekir. Eşit md5sum olan çizgiler eşit kabul edilmelidir. Çıkış normal diff formatında olmalıdır.

cevap

14

Kolay marş: Ayrıca

diff <(cut -d' ' -f1 md5s1.txt) <(cut -d' ' -f1 md5s2.txt) 

, sadece

diff -EwburqN folder1/ folder2/ 
+1

yaparak yükleyebilirsiniz * n * karakterleri, bir şey gibi: 'diff <(cut -b-80 dump.csv) <(cut -b-80 dump2.csv)' (burada, 'n' = 80) –

2

<(cut -c -32 md5sums.sort.XXX) üzerinde diff kullanan tek md5 sütunu karşılaştırın düşünün ve eklenen veya kaldırılan hatlarının sadece satır numaralarını yazdırmak için diff anlatmak --old/new-line-format='%dn'$'\n' kullanarak. Bunu ed md5sums.sort.XXX içine gönderin, böylece yalnızca md5sums.sort.XXX dosyasındaki satırları yazdıracaktır.

diff \ 
    --new-line-format='%dn'$'\n' \ 
    --old-line-format='' \ 
    --unchanged-line-format='' \ 
    <(cut -c -32 md5sums.sort.old) \ 
    <(cut -c -32 md5sums.sort.new) \ 
    | ed md5sums.sort.new \ 
    > files-added 
diff \ 
    --new-line-format='' \ 
    --old-line-format='%dn'$'\n' \ 
    --unchanged-line-format='' \ 
    <(cut -c -32 md5sums.sort.old) \ 
    <(cut -c -32 md5sums.sort.new) \ 
    | ed md5sums.sort.old \ 
    > files-removed 

ed sorun size sağlama çok şey var eğer bir sorun olabilir belleğe dosyanın tamamını yüklemek olacaktır. Farkı ed içine borulamak yerine, daha az bellek kullanacak olan aşağıdaki komutla boruya geçirin. çift ​​dosyaları arıyorsanız

diff … | (
    lnum=0; 
    while read lprint; do 
     while [ $lnum -lt $lprint ]; do read line <&3; ((lnum++)); done; 
     echo $line; 
    done 
) 3<md5sums.sort.XXX 
1

fdupes sizin için bunu yapabilirsiniz:

ubuntu üzerinde
$ fdupes --recurse 

Eğer gerçekten istiyorsanız bu cevabı genişletme

$ apt-get install fdupes