Este artículo fue publicado originalmente en go2linux.org. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras.
Una vez tuve que mover un archivo .tar.gz grande de un servidor FTP a otro, pasando por mi PC. Después de subirlo al segundo servidor resultó que estaba corrupto, y la copia en mi escritorio tenía el mismo error. Si hubiera revisado el archivo cuando llegó a mi PC, me habría ahorrado el tiempo de la segunda transferencia.
Una suma de verificación resuelve eso. md5sum lee un archivo e imprime una huella corta de su contenido. Si cambia un solo bit, la huella cambia. Calcúlala en ambos extremos, compara, y sabrás si la copia es idéntica.
Suma de verificación de un archivo
md5sum respaldo.tar.gz
bce4769e984bcb13961eb7a149038c50 respaldo.tar.gz
La salida es el hash, dos espacios y el nombre del archivo. Ejecuta el mismo comando en el otro equipo y compara los hashes. Se pueden indicar varios archivos a la vez:
md5sum *.iso
Crear un archivo de sumas y verificarlo
Comparar 32 caracteres a ojo se presta a errores. Mejor guarda la salida en un archivo:
md5sum respaldo.tar.gz > respaldo.tar.gz.md5
Lleva ambos archivos al destino, y allí ejecuta md5sum con -c (check):
md5sum -c respaldo.tar.gz.md5
respaldo.tar.gz: OK
Cuando el archivo está dañado:
respaldo.tar.gz: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
Los mensajes aparecen traducidos si tu sistema está en español. El código de salida es 0 solo cuando todos los archivos coinciden, así que sirve en scripts:
md5sum -c --status respaldo.tar.gz.md5 && echo "la copia está bien"
Un directorio completo
Usa find para ejecutar md5sum sobre cada archivo regular debajo del directorio actual. Escribe la lista fuera del directorio, para que no termine incluyéndose a sí misma:
cd /srv/fotos
find . -type f -exec md5sum {} + > ../fotos.md5
El resultado es una línea por archivo:
bce4769e984bcb13961eb7a149038c50 ./xp15.png
b9a474939619ce6717fc87b1d5873f7d ./office6.png
e3e202d0be6e4bd4b449537c0819b851 ./2024/ubuntu7.png
Después de copiar el directorio, entra en la copia y revísala contra la lista:
cd /mnt/respaldo/fotos
md5sum -c --quiet ../fotos.md5
--quiet imprime solo los archivos que fallan, que es lo que quieres con miles de archivos. Si no hay salida, todo coincidió. Los archivos que están en la lista pero faltan en la copia se informan como errores; los que solo están en la copia pasan inadvertidos, porque la lista no los conoce.
Usa sha256sum cuando importa
MD5 está bien para el caso anterior: detectar daños accidentales durante una transferencia o en un disco que está fallando. No es seguro frente a alguien que altera un archivo a propósito. Producir dos archivos distintos con el mismo hash MD5 es factible desde hace años.
Para cualquier cosa relacionada con seguridad, usa sha256sum. Viene en el mismo paquete (coreutils) y acepta exactamente las mismas opciones:
sha256sum respaldo.tar.gz > respaldo.tar.gz.sha256
sha256sum -c respaldo.tar.gz.sha256
sha1sum, sha512sum y b2sum funcionan de la misma forma.
Verificar una ISO descargada
Las distribuciones publican un archivo con los hashes de todas sus imágenes, normalmente llamado SHA256SUMS. Descárgalo en el mismo directorio que la imagen y ejecuta:
sha256sum -c --ignore-missing SHA256SUMS
debian-13.1.0-amd64-netinst.iso: OK
--ignore-missing omite las imágenes listadas en el archivo que no descargaste.
Si el sitio solo muestra el hash en una página web, arma la línea tú mismo. Cuidado con los dos espacios entre el hash y el nombre del archivo:
echo "PEGA_AQUI_EL_HASH debian-13.1.0-amd64-netinst.iso" | sha256sum -c -
Una suma descargada del mismo servidor que el archivo prueba que la descarga está completa, no que sea auténtica: quien pudiera reemplazar la imagen podría reemplazar también la suma. Para eso las distribuciones firman el archivo de sumas con GPG, y la firma se verifica con gpg --verify.
Comparar dos archivos rápidamente
md5sum archivo1 archivo2
Mismo hash, mismo contenido. Para encontrar todos los duplicados en un directorio, ordena por hash e imprime los repetidos:
find . -type f -exec md5sum {} + | sort | uniq -w32 -D
En macOS
macOS no incluye md5sum. Los equivalentes son md5 y shasum -a 256. Mira md5sum en Mac OS X (en inglés).
Ver también
man md5sum y man sha256sum — referencia completa.