Para encontrar archivos duplicados en Linux desde la línea de comandos sin instalar nada, calcula el hash md5 de cada archivo y deja que uniq marque los repetidos: find d -type f -exec md5sum {} + | sort | uniq -w32 -dD. Casi todos los resultados de búsqueda son reseñas de herramientas que primero hay que instalar — fdupes, rdfind, rmlint. En un servidor ajeno o en un contenedor desechable, muchas veces no puedes instalar nada. Esto es un pipeline hecho solo con coreutils, más la frontera honesta donde sí conviene instalar una herramienta.
1. Duplicados por contenido, sin instalar paquetes
$ clai busca archivos con el mismo contenido en la carpeta d→ find d -type f -exec md5sum {} + | sort | uniq -w32 -dD4f784201526479699db75d69c7abad6d d/a/one.txt4f784201526479699db75d69c7abad6d d/b/two-copy.txt
uniq -w32 compara solo los primeros 32 caracteres de la línea — justo la longitud de un hash md5, así que la comparación es por contenido, no por nombre. -d deja solo los repetidos, -D imprime todas las líneas del grupo, no solo una.
2. Cuenta antes de decidir
$ clai cuántos grupos de duplicados hay en total→ find d -type f -exec md5sum {} + | sort | uniq -w32 -d | wc -l
Una línea por grupo. Si hay tres grupos, revísalos a simple vista. Si hay tres mil, necesitas una herramienta con modo interactivo, no un pipeline.
3. No hashees terabytes en balde
$ clai busca duplicados solo entre archivos de más de 10 megabytes→ find . -type f -size +10M -exec md5sum {} + | sort | uniq -w32 -dD
md5 lee el archivo entero. En un árbol grande, filtrar por tamaño primero acelera todo en un orden de magnitud — y son los archivos grandes los que ocupan el espacio.
4. Más rápido: primero por tamaño, luego por hash
$ clai busca duplicados rápido, filtrando primero por tamaño→ find . -type f -printf '%s\n' | sort -n | uniq -d | while read s; do find . -type f -size "${s}c" -exec md5sum {} + ; done | sort | uniq -w32 -dD
Archivos de tamaños distintos no pueden ser duplicados. Solo se hashean los que coinciden en tamaño. En un árbol con un millón de archivos, eso es la diferencia entre minutos y horas.
5. Deja una copia de cada grupo
$ clai muéstrame qué duplicados puedo borrar, dejando una copia de cada uno→ find . -type f -exec md5sum {} + | sort | uniq -w32 -d --all-repeated=separate | awk 'seen[$1]++ {print $2}'
awk 'seen[$1]++' se salta la primera aparición de cada hash e imprime todas las siguientes — la lista de candidatos a borrar. Es una lista para leer, no para pasarle a xargs rm. Léela.
6. Cuándo instalar una herramienta de una vez
$ clai busca duplicados y déjame borrarlos de forma interactiva→ fdupes -r -d .
Si hay cientos de grupos y quieres que te pregunten por cada uno, fdupes -d pregunta qué conservar. rdfind puede reemplazar duplicados con enlaces duros sin borrar nada. El pipeline de arriba es para donde no se pueden instalar paquetes.
Trampas
- md5 alcanza para encontrar duplicados, no para seguridad. Una colisión de md5 se puede construir a propósito; por accidente no pasa. Para verificar integridad usa sha256; para buscar copias, md5 es más rápido y suficiente.
- Los enlaces duros parecen duplicados. El mismo archivo con dos nombres da el mismo hash, pero ocupa espacio una sola vez. Fíltralos por número de inodo:
find . -type f -printf '%i %p\n' | sort -u -k1,1. - Nunca pases la lista directo a rm. Un filtro mal puesto y borras las dos copias. Guarda la lista en un archivo, léela y luego borra.
Preguntas relacionadas
¿Cómo busco duplicados por nombre en vez de por contenido? find . -type f -printf '%f\n' | sort | uniq -d muestra nombres que se repiten en distintos directorios.
¿Funciona en macOS? Cambia md5sum por md5 -r — el formato de salida coincide. También tendrás que cambiar -printf de find por -exec stat -f.
¿Qué es más rápido para cientos de miles de archivos? El enfoque de la sección 4, o rdfind, que ordena por inodo antes de tocar el disco.
Ver también
- ¿Qué carpeta se está comiendo el disco? du, ordenado de mayor a menor
- df dice que el disco está lleno, du dice que no
- Deja de memorizar flags de find
CliAI no hashea tus archivos por ti, pero te libra de reinventar el flag uniq -w32 cada vez. Instálalo en una línea.