¿La forma más rápida de saber si dos archivos son iguales en Unix/Linux?

Tengo un script en el que necesito comprobar si dos archivos son iguales o no. Hago esto para muchos archivos, y en mi script el comando diff parece ser el cuello de botella del rendimiento.

Aquí'está la línea:

diff -q $dst $new > /dev/null

if ($status) then ...

¿Podría haber una forma más rápida de comparar los archivos, tal vez un algoritmo personalizado en lugar del predeterminado diff?

Solución

Creo que cmp se detendrá en el primer byte de diferencia:

cmp --silent $old $new || echo "files are different"
Comentarios (10)

¿Por qué no obtienes el hash del contenido de ambos archivos?

Prueba con este script, llámalo por ejemplo script.sh y ejecútalo de la siguiente manera: script.sh archivo1.txt archivo2.txt

#!/bin/bash

file1=`md5 $1`
file2=`md5 $2`

if [ "$file1" = "$file2" ]
then
    echo "Files have the same content"
else
    echo "Files have NOT the same content"
fi
Comentarios (23)

Para archivos que no son diferentes, cualquier método requerirá haber leído ambos archivos por completo, incluso si la lectura fue en el pasado.

No hay alternativa. Así que crear hashes o sumas de comprobación en algún momento requiere leer todo el archivo. Los archivos grandes llevan tiempo.

La recuperación de metadatos de archivos es mucho más rápida que la lectura de un archivo grande.

Entonces, ¿hay algún metadato de archivo que pueda usar para establecer que los archivos son diferentes? ¿El tamaño del archivo? ¿o incluso los resultados del comando file que sólo lee una pequeña parte del archivo?

Fragmento de código de ejemplo de tamaño de archivo:

  ls -l $1 $2 | 
  awk 'NR==1{a=$5} NR==2{b=$5} 
       END{val=(a==b)?0 :1; exit( val) }'

[ $? -eq 0 ] && echo 'same' || echo 'different'  

Si los archivos son del mismo tamaño, entonces usted está atascado con lecturas de archivos completos.

Comentarios (1)