Eliminar los archivos antiguos de la papelera de reciclaje de gnome

Aviso: A partir de la versión 2.22 de Gnome, que se distribuye con Ubuntu 8.04 el formato de la papelera de reciclaje cambió y no funciona más esta técnica.

Para información más actualizada sobre la papelera consulta el post  ¿Donde está la papelera de reciclaje?

Hace unos días me encontré con mi disco rígido casi totalmente lleno. Sin embargo recordaba que hace poco había estado haciendo limpieza y debería al menos haber liberado 8 gigas de espacio.

Lo que había sucedido es que en lugar de eliminar los archivos, los había enviado a la papelera de reciclaje.

Soy una persona bastante olvidadiza y no siempre recuerdo vaciarla. Y a decir verdad tampoco me agrada la idea de vaciarla siempre ya que muchas veces me ha sacado de apuros. Sin embargo tener archivos que borré hace más de una semana en la papelera no es muy útil. Casi nunca necesito recuperar cosas tan vieja.

Entonces comencé a buscar en internet si había forma de configurar la vida máxima de los elementos de la papelera.

Desgraciadamente encontré varias personas con mi problema, pero pocas soluciones. La mayoría proponían scripts que simplemente borraban toda la papelera cada X cantidad de tiempo, y otros más parecidos a lo que yo necesitaba tenían problemas para determinar los archivos a eliminar, siendo el principal problema que eliminaban cosas antes de tiempo

Así que me decidí a hacer mi propio método para conseguir una papelera que vaya purgando los elementos viejos automáticamente y no requiera intervención de mi parte.

En este artículos paso a detallar como funciona mi método y adjunto el script que resultó de mi investigación

En gnome, la papelera de reciclaje es un directorio en el home de cada usuario llamado .Trash (comienza por punto por ser un directorio oculto) . En ese directorio se mueven todos los archivos que borra el usuario. Lamentablmente gnome no guarda en ningún lugar alguna metadata que indique desde donde se borro el archivo o en que fecha fue hecho así que esa información tenía que recuperarla de alguna otra manera.

Cabe destacar que, revisando en internet, vi que hubieron intentos para proponer un standard para la papelera, ya que gnome y kde tienen un esquema totalmente diferente e incompatible. Mi solución solo sirve para gnome porque es el que yo uso en mi día a día.

Necesitaba saber la fecha en que fue borrado un archivo. ¿Pero como conseguir esa fecha? Resulta que en linux cada archivo o directorio tiene tres fecha. A saber atime, mtime y ctime (access time, modified time, creation time respectivamente). Al menos en mi investigación no me quedó bien en claro las pequeñas sutilezas de diferencias entre cada una de ellas. Así que recurrí a la prueba y error, y comencé a borrar archivos, copiarlos y demás para ver como alteraban cada operación cada una de las fechas.

El resultado, únicamente testeado en mi pc con Ubuntu 7.10, fue el siguiente:

  • atime: es la fecha de último acceso al archivo. Lamentablemente, basta abrir una carpeta en nautilus para que esa fecha se cambie a la fecha actual en todo el contenido de esa carpeta. Esto está bien ya que nautilus para mostrar el thumnail y previews o no se que cosas más hará necesita acceder al archivo y en consecuencia se cambia su atime. Además, uno puede configurar el sistema para que no actualice nunca el atime para evitar escrituras innecesarias de disco. Por estos motivos atime no era una opción viable para mi script. O nunca se actualizaría o con el solo abrir la papelera de reciclaje para recuperar un archivo o simplemente ver que tenía, cambiaría las fechas de todos los archivos y afectaría al script
  • mtime: es la fecha de modificación de un archivo. O sea, que le cambio el contenido. No queda claro si esta fecha se actualiza también si cambio los atributos del archivos, como owner o permisos. Pero lo que si me quedó claro es que el mover un archivo no cambia esta fecha. En consecuencia no me servía para determinar la fecha de eliminación de un archivo
  • ctime: esta es la fecha de creación de un archivo. Y resultó ser la que necesitaba. Experimentando con esta fecha descubrí (a mi sorpresa) que cuando muevo de directorio un archivo esta fecha se actualiza pero otras operaciones no la afectaban. No investigué que pasaba si cambiaba los permisos ya que había encontrado lo que buscaba y supuse que cambiar los atributos de un archivo en la papelera de reciclaje no es una operación muy normal. Al menos no lo es para mi.

Armado con este conocimiento decidí que el script básicamente debía ser ejecutar el comando find, indicando que los archivos debían tener una determinada ctime y a aquellos archivos que cumplían el criterio, borrarlos.

El comando al que había llegado tenía la siguiente forma:

find ~/.Trash -ctime +7 -execdir rm -rf {} \;

Al testearlo el problema fueron los directorios. Esta función busca tambien los archivos dentro de los directorios. Pero el ctime de los archivos contenidos dentro de un directorio no se actualizaba, sino que quedaba el mismo que tenían antes de ser borrados. Entonces no eran confiables, pero razonando un poco llegué a la conclusión de que no me importaba la fecha de sos archivos, sino solo la del directorio que habia sido borrado que si se actualizaba.

En resumen, no debía buscar adentro de los directorios de la papelera, sino solo lo que estaba en la raiz de la papelera. El comando pasó a tener la siguiente forma.

find ~/.Trash -maxdepth 1 -ctime +7 -execdir rm -rf {} \;

Ya estaba mucho mejor, pero quería hacerlo más flexible. O sea que sirva para cualquier directorio y no solo la papelera y poder especificar la cantidad de días, que no sea fija en 7, y por algun motivo que no recuerdo aún tenia algunos problemas para eliminar archivos y directorios, así que el resultado fueron dos finds. Uno para borrar directorios y otro para borrar archivos.

find $BASE_DIR -maxdepth 1 -ctime +$DAYS -type f -execdir rm -f {} \;
find $BASE_DIR -maxdepth 1 -ctime +$DAYS -type d -execdir rm -rf {} \;

Obviamente, esas son las lineas que hace la magia, pero pueden Descargar el archivo que yo utilizo aunque no es mucho mas largo que lo que aquí expliqué. Demás está decir que tengan mucho cuidado con el uso de este script y que si bien espero a todos les sea útil, ni yo, ni 3f, ni nadie se hará responsable de cualquier problema o pérdida de información ya sea por un error en el script o por error en su uso.

La sintaxis de para usar el script es delete_old_files.sh <directorio> <dias>, por ejemplo para borrar aquellos archivos de la papelera de reciclaje de un usuario llamado fernando que tengan más de 7 días: delete_old_files.sh /home/fernando/.Trash 7

Como la gracia es que sea automático, usé el comando crontab para que se ejecute automáticamente. Para hacer esto, escribí en una termina crontab -e

Y agregé la siguiente linea en el documento que me abre:

*/30 * * * * /home/fernando/bin/delete_old_files.sh /home/fernando/.Trash 7

Esto hace que cada 30 minutos chequee si hay algo para borrar. Podría hacerse menos seguido, con unas dos veces al día creo que sería suficiente porque no necesita ser muy preciso.

Obviamente, la linea anterior hay que modificarla con los path y preferencias que cada uno desee.En mi caso quiero borrar de mi papelera de reciclaje los archivos de más de 7 días y el script lo copié en el directorio /home/fernando/bin/delete_old_files.sh.

Obviamente hay un montón de errores y cosas que este script no hace bien y las dejo aquí plasmadas para que si alguien quiere mejorarlo, o sabe de la solución, me avise

  • Si borro un directorio que dentro tiene subdirectorios que yo no soy el owner ni tengo permisos y el script no se ejecuta como root, no podrá nunca borrar esos directorios (esta limitación la tiene la mismísima papelera de reciclaje también)
  • gnome no tiene una única papelera de reciclaje. Sino que tiene una en cada mountpoint. Por ejemplo, si tengo /var en una paticion diferente a mi home, en lugar de ir los archivos que borro a ~/.Trash van a /var/.Trash/<nombreusuario>. En consecuencia, no es cierto que se borra toda la papelera de reciclaje, sino únicamente la que yo le indiqué en el path.
  • Solo funciona con un directorio a la vez. Si tengo cinco usuarios cada uno con su propia papelera de reciclaje.. o invoco cinco veces el script (y encima como root o algun usuario que tenga permisos sobre todos!) o solo borrara un directorio.

El primer problema se soluciona ejecutando el script como root, pero sería peligroso. No me agrada la idea de ejecutar cosas que borran archivos automáticamente como root. El segundo problema se me ocurre hacer el script más complejo y únicamente para papeleras de reciclaje. El tercero la solución es la misma que la del segundo.

En fin, espero les sea útil al igual que lo es para mi. Y cualquier duda, problema o ganas de agradecer no duden en dejar un comentario.


3 Responses to “Eliminar los archivos antiguos de la papelera de reciclaje de gnome”

  1. Hola,

    estoy haciendo un proyecto final de carrera con FUSE y necesitaba tener claro para que servia el atime ctime y mtime y tu post me ha sido de utilidad, gracias!

    pero creo que tengo la explicación de porqué el valor que te interesa es el ctime ( creation Time) contra todo pronostico.

    Puede ser que tus datos esten en una particion distinta que tu home?
    si es así, al borrar un fichero, pongamos de hda5, lo que hace gnu/linux es mover su contenido a la papelera. Para hacerlo, como la papelera esta en una particion y el doc original en otra, debe CREAR el inodo del directorio. Los subarchivos, es posible que no los mueva, por eso el ctime de ellos sigue inalterable.

    Pero segun mi hipotesi, al mover un fichero a la papelera si esta en la misma particion, el ctime no deberia cambiar. Ya que sencillamente mueve el enlace del inodo a otro punto del arbol. Al ser la misma partición, el arbol és el mismo y no crea nada nuevo. Solo lo mueve como conceptualmente te venia a la cabeza.

    Puedes confirmarme si mi hipotesi es cierta?

    grácias!!!

  2. En verdad me alegra muchisimo que te haya resultado util mi artículo pero lamento decirte que no es correcta tu hipotesis.

    Siempre hablando de Gnome, la papelera esta repartida en varios directorios dependiendo la partición.

    Por decisión de diseño Dios sabe cuando y por quienes, Gnome al borrar un archivo siempre lo MUEVE.

    Si mi home esta en una partición diferente al del archivo borrado, como bien has dicho, no podria mover el archivo, deberia copiarlo. Entonces como lo resuelven.

    En el mounpoint de cada partición se crea un directorio oculto llamado .Trash y dentro de ese directorio se crean directorios con el nombre del usuario. Entonces, cuando se borra un archivo que no esta en la misma particion que el home, se mueve a ese directorio, pero siempre se mueve, nunca se copian archivos.

    Esto es unicamente válido para gnome, en kde la papelera se comporta de otra manera. Por ahora esto es un tema no estandarizado en linux.

    Mi hipotesis del por que actualiza el ctime es que el ctime debe modificarse no cuando se crea el archivo, sino cuando se modifica el inode, y este actualiza el ctime.

    En cambio el mtime, no es la fecha de modificacion del inode sino de los datos apuntados por el inode.. Al menos esa es mi hipotesis, lo cual no significa que sea correcta.. pero aun no me la refuté a mi mismo jeje

    Saludos

  3. […] […]

Discussion Area - Leave a Comment