El incremento en la velocidad de tu internet, de unos pocos kbps hasta las velocidades actuales, tienes muchas ventajas. Ha permitido que tengas al alcance de tus manos grandes cantidades de información, en cualquier formato, tanto documentos escritos, como audio como vídeo. Bueno, mas que al alcance de tus manos, en el interior de tus diiscos duros. Pero, evidentemente, esto también tiene un problema, un grave problema, nos estamos convirtiendo en unos Diógenes digitales. Almacenamos grandes cantidades de documentos, y en ocasiones por duplicado. Y justo esto es lo que voy a tratar en este artículo, eliminar duplicados en Linux.
Inicalmente, podrías pensar, que con la velocidad que aumenta el tamaño de los discos, tener porquería digital, tampoco es tan problemático. Sin embargo, tener duplicados en Linux es un problema. No porque sea Linux, si no porque es problemático en cualquier Sistema Operativo, y en la vida en general.
No hace falta ser un genio, para caer en la cuenta que es mas fácil buscar entre 100 documentos que entre 100.000. ¿No te parece?.
Eliminar duplicados en Linux
Como te decía en la introducción, el objetivo de este artículo, es hablarte de una herramienta que te va a permitir encontrar archivos duplicados en tu equipo.
Para este objetivo, te voy a hablar en concreto sobre fdupes. Una herramienta que se encaraga de encontrar todos los archivos duplicados en Linux. Pero además fdupes te va a permitir borrar los archivos duplicados.
fdupes utiliza md5sums en la búsqueda de duplicados. En el caso de que el resultado sea igual, entonces realiza una comparación byte a byte.
Así, por ejemplo, para encontrar todos los archivos duplicados en un directorio y subdirectorios, es tan sencillo como ejecutar la siguiente instrucción,
fdupes -r ~/home/lorenzo
Esto en mi directorio, con unos 118.000 archivos se ha llevado unso 30 segundos aproximadamente. No está nada mal, ¿no te parece?.
Opciones de fdupes
fdupes tiene una serie de opciones que te permite afinar el trabajo de esta herramienta. Así, algunas de las opciones que te ofrece esta aplicación son las siguientes,
-r
ó--recurse
realiza la búsqueda de forma recursiva en todos los directorios que le hayas proporcionado.-R
ó--recurse:
realiza la búsqueda como en el caso anterior, pero solo en los directorios que vayan a continuación de esta opción. Es decir, en el caso defdupes dir1 --recurse: dir2
, buscará solo de forma recursiva endir2
, mientras endir1
solo realizará la búsqueda en el primer nivel.-s
ó--symlinks
en este caso sigue los enlaces simbólicos. Para mi, tener esta opción es imprescindible, dado que gran parte de los directorios en/home
están enlazados de forma simbólica, tal y como explico en el artículo sobre como tener varios sistemas Linux en un PC-H
ó--hardlinks
esta opción es equivalente a la opción anterior, pero para el caso de enlaces duros. Recuerda que un enlace duro o enlace físico, es una referencia o puntero a un archivo.-n
ó--noempty
no tiene en cuenta los archivos de tamaño0
.-f
ó--omitfirst
omite el primer archivo de un conjunto de coincidencias. Así, sifdupes
encuentra una docena de duplicados, por ejemplo, con esta opción no devolvería el primero que haya encontrado.-A
ó--nohidden
no tienes encuenta los archivos ocultos en la búsqueda.-1
ó--sameline
con esta opción te muestra cada conjunto de duplicados en una única línea. Esto te puede venir perfecto para realizar un recuento conwc
o bien, para hacer un procesado posterior.-S
ó--size
muestra el tamaño de los archivos duplicados.-m
ó--summarize
muestra un resumen de los archivos duplicados cuando termina el proceso de búsqueda de duplicados.-q
ó--quiet
oculta el indicador de progreso.-d
ó--delete
pregunta el usuario por los archivos que quiere guardar, borrando el resto de archivos.-N
ó--noprompt
si la utilizas junto con la opción anterior--delete
, preserva el primero de los archivos, borrando el resto de los archivos duplicados, pero esta vez sin preguntarte.-I
ó--immediate
borra cada duplicado conforme los encuentra. Es decir, esta opción no realiza la agrupación de duplicados. Esta opción no te pregunta.-p
ó--permissions
si utilizas esta opción, dos archivos iguales pero con diferentes usuarios o grupos o permisos se cosideran como si fueran distintos.-o
ó--order=time
ó--order=name
. Ordena los duplicados en función a la fechatime
o en función al nombre,name
del archivo respectivamente.-i
ó--reverse
, tiene la misma consideración que el punto anterior pero lo ordena en forma inversa.v
ó `–version, muestra la versión de fdupes.h
ó--help
, te mostrará la ayuda de esta herramienta.
A la práctica
Una vez ya tienes claras todas las opciones que te ofrece esta herramienta, te invito a que me acompañes a una serie de ejemplos prácticos, para que te hagas una idea del funcionamiento de la aplicación.
Parto de la siguiente estrucutra de archivos y directorios,
.____ejemplo
| |____subdir
| | |____subdirl2
| | |____ejemplo1.txt
| | |____ejemplol1.txt
| |____ejemplol3.txt
| |____ejemplo.txt
| |____ejemplo3.txt
| |____ejemplo1.txt
| |____ejemplo2.txt
| |____ejemplol1.txt
| |____ejemplol2.txt
Si ejecuto fdupes -S ejemplo
, el resultado es el siguiente,
25 bytes each:
ejemplo/ejemplol1.txt
ejemplo/ejemplol3.txt
20 bytes each:
ejemplo/ejemplo2.txt
ejemplo/ejemplol2.txt
17 bytes each:
ejemplo/ejemplo.txt
ejemplo/ejemplo3.txt
ejemplo/ejemplo1.txt
Si no utilizas la opción -S
, el resultado es exactamente el mismo, con la diferencia de que no te muestra el resumen de espacio ocupado por cada conjunto de archivos.
Si tenemos en cuenta la opción de recursividad con fdupes -Sr ejemplo
(*Sr de señor), el resultado será,
25 bytes each:
ejemplo/ejemplol1.txt
ejemplo/ejemplol3.txt
ejemplo/subdir/ejemplol1.txt
20 bytes each:
ejemplo/ejemplo2.txt
ejemplo/ejemplol2.txt
17 bytes each:
ejemplo/ejemplo.txt
ejemplo/ejemplo3.txt
ejemplo/ejemplo1.txt
ejemplo/subdir/ejemplo1.txt
Si quieres ver los resultados además de mostrarlos en el terminal tendrás que hacer uso de la herramienta tee
. Por ejemplo, fdupes -Sr ejemplo | tee resultado.txt
.
Si quieres ver cada conjunto en una única línea, la instrucción a ejecutar es fdupes -Sr1
, y el resultado quedará de la siguiente forma,
25 bytes each:
ejemplo/ejemplol1.txt ejemplo/ejemplol3.txt ejemplo/subdir/ejemplol1.txt
20 bytes each:
ejemplo/ejemplo2.txt ejemplo/ejemplol2.txt
17 bytes each:
ejemplo/ejemplo.txt ejemplo/ejemplo3.txt ejemplo/ejemplo1.txt ejemplo/subdir/ejemplo1.txt
Borrando
Si quieres borrar, tienes la opción de hacerlo, como has visto en las opciones, partiendo de que te pregunte con fdupes -Sr1d ejemplo
, lo que te mostrará algo como,
[1] ejemplo/ejemplol1.txt
[2] ejemplo/ejemplol3.txt
[3] ejemplo/subdir/ejemplol1.txt
Set 1 of 3, preserve files [1 - 3, all] (25 bytes each):
Como ves te permite seleccionar que archivo quedarte o incluso quedarte con todas. Por supuesto también lo puedes hacer sin preguntar. En este caso, se queda con el primero. Por ejemplo, fdupes -dN ejemplo
, te devolverá lo siguiente,
[+] ejemplo/ejemplol1.txt
[-] ejemplo/ejemplol3.txt
[+] ejemplo/ejemplo2.txt
[-] ejemplo/ejemplol2.txt
[+] ejemplo/ejemplo.txt
[-] ejemplo/ejemplo3.txt
[-] ejemplo/ejemplo1.txt
Por supuesto, puedes recurrir a la ordenación para seleccionar el último que has creado para que se quede, en lugar del primero fdupes -o time -idN ejemplo
. Esto se traduce en lo siguiente,
[+] ejemplo/ejemplo3.txt
[-] ejemplo/ejemplo5.txt
[-] ejemplo/ejemplo4.txt
[-] ejemplo/ejemplo2.txt
Conclusión
Como has podido ver, se trata de una herramienta extremadamente sencilla de utilizar, y que de una forma muy intuitiva, te va a ayudar a terminar con tu basura digital, o por lo menos a reducir tu basura digital, y eliminar duplicados en Linux.
Por supuesto, esta herramienta es carne de cañón para automatizar procesos. Eso si, es muy recomendable que lo hagas con mucho detenimiento, para solo eliminar duplicados en Linux, y evitar hacer un destrozo en tu sistema de archivos.
Más información,
- GitHub
- Adrian Lopez es el autor de esta herramienta.
Imagen de portada de Amir-abbas Abdolali en Unsplash