e-interiores Headline Animator

5.3.07

Buscar archivos duplicados en disco

Desde que me compré un disco duro externo de 400Gb, no hago nada más que acumular archivos, películas, ebooks, programas,... retándome a mi mismo a ver cuanto tardo en llenarlo (ya lo tengo al 60% en un par de meses...)
Por eso y porque no le dedico mucha atención a mantenerlo todo organizado, me ocurre que a veces encuentro un mismo fichero en varias carpetas.
Para solucionarlo he pensado en programar algún sistema que me permita ver que fichero tengo repetidos. Me decidí por hacer un script en shell para realizar esta tarea.
La idea es generar un archivo txt que tiene todos los ficheros del disco duro con su tamaño y path. A partir de este obtengo otro fichero donde los ordeno por tamaño y muestro cuantos tengo del mismo tamaño ordenados por tamaño decreciente. Soospecho de aquellos que teniendo un gran tamaño está repetidos.
Al final he llegado a hacer el script de una forma compacta pero creo que he aprendido mucho por el camino por lo que voy a reproducir todo el proceso.
Aviso de que el tema es duro y latoso.

El comando stat permite definir los datos que queremos mostrar de un fichero y el formato en el que lo obtenemos. Detalles en oreilly.
El problema son los espacios que contienen los nombres de los ficheros.
He intentado usando el comando tr traducir las cadenas y reemplazar los espacios para escaparalos (Detalles oreilly y linux journal).

Una solución más sencilla es usar el supercomando find
usando find (detalles oreilly) con la opcion printf.
Podemos procesar la salida con sed (detalles aquí y linux journal y aquí"

Otra opción es crear un script que haga el trabajo:
find /media/sda1 -print | sed 's/ /\\ /g' | sed 's/^/stat -c "%s %N\\n" /g'
¿ventajas? Carga menos a la shell porque no tiene que mantener en memoria un lista tan grande de argumentos, se va procesando línea a linea. Sólo falta darle permiso de ejecución y a volar.
(¿debería de explicar la diferencia entre las comillas " ,' y ` ?)

Al final era muuuucho más fácil, sólo tenía que leer completa la ayuda de find:
find . -printf "%s %p\n"
cut -d"|" -f1 ficheros.ordenado.txt | uniq -c -d

No hay comentarios: