2011-05-18 7 views
14

Tengo 2 archivos. Vamos a llamarlos md5s1.txt y md5s2.txt. Ambos contienen la salida de unarchivos de diferencias que solo comparan n primeros caracteres de cada línea

find -type f -print0 | xargs -0 md5sum | sort > md5s.txt 

comando en diferentes directorios. Muchos archivos fueron renombrados, pero el contenido permaneció igual. Por lo tanto, deberían tener el mismo md5sum. Quiero generar un diff como

diff md5s1.txt md5s2.txt 

pero debe comparar sólo los primeros 32 caracteres de cada línea, es decir, solamente la suma md5, no el nombre de archivo. Las líneas con igual md5sum deben considerarse iguales. La salida debe estar en formato de diferencia normal.

Respuesta

14

Fácil arranque:

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

Además, considere simplemente

diff -EwburqN folder1/ folder2/ 
+1

La extensión de esta respuesta, si realmente quiere * n * caracteres, algo así como: 'diff <(corte -b-80 dump.csv) <(corte -b-80 dump2.csv)' (aquí, 'n' = 80) –

2

comparar sólo la columna de la MD5 utilizando diff en <(cut -c -32 md5sums.sort.XXX), y di diff para imprimir sólo los números de línea de las líneas añadidas o eliminadas, usando --old/new-line-format='%dn'$'\n'. Tipee esto en ed md5sums.sort.XXX para que solo imprima esas líneas del archivo md5sums.sort.XXX.

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 

El problema con ed es que va a cargar el archivo en la memoria, que puede ser un problema si usted tiene un montón de sumas de comprobación. En lugar de conectar la salida de diff en ed, conéctelo al siguiente comando, que utilizará mucha menos memoria.

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

Si busca archivos duplicados fdupes pueden hacer esto para usted:

$ fdupes --recurse 

en Ubuntu puede instalarlo haciendo

$ apt-get install fdupes 
Cuestiones relacionadas