¿Cómo hacer que mi sistema elimine todos los archivos en un determinado directorio anterior a un cierto tiempo manteniendo intacta la estructura del directorio?

12

Tengo un directorio en mi máquina, lo considero mi propio tipo de tmpdirectorio, pero está en mi ~directorio. Y quiero hacerlo para que mi sistema cada 3 horas elimine todos los archivos (aunque mantenga intacta cualquier estructura de directorio, pero aún elimine todos los archivos en todos los niveles de los directorios de forma recursiva) ese directorio que sea más antiguo que un día.

Estoy ejecutando Ubuntu GNOME 15.10 con GNOME 3.18, ¿se puede hacer esto? Y si es así, ¿cómo? Me gustaría que esto esté completamente automatizado sin necesidad de interacción de los usuarios. Esto debería ser algo que se inicia automáticamente cuando inicio sesión, por lo que no debería necesitar ejecutar algo en cada inicio.


fuente

Respuestas:

21

Utilizando find:

find ~/tmp -type f -mtime +0 -delete
  • ~/tmp es el directorio que se buscará de forma recursiva, cambie esto en consecuencia

  • -type f buscará solo archivos

  • -mtime +0 que coincidirá con un archivo si se modificó por última vez hace un día o más

  • -delete solo eliminará los archivos coincidentes

Aquí está la trampa -mtime +0, la mayoría podría pensar en usar, -mtime +1pero findignorará cualquier tiempo fraccional al calcular los días. Por lo tanto, -mtime +1coincidirá con un archivo si la última modificación se realizó al menos hace 2 días.

Citando man find, -mtimetiene la misma convención de tiempo que -atime:

-ahora n

Se accedió al archivo por última vez hace n * 24 horas. Cuando descubra cuántos períodos de 24 horas se accedió al archivo por última vez, se ignora cualquier parte fraccional, por lo que para que coincida con -atime +1, se debe haber accedido a un archivo al menos hace dos días.

También tenga en cuenta que si desea precisión, debe mirar la -mminopción de findindicar el tiempo en minutos.

Para ejecutarlo periódicamente después de 3 horas, puede agregar una cronentrada.

Ejecuta crontab -ey agrega:

00 */3 * * * /usr/bin/find ~/tmp -type f -mtime +0 -delete

Utilizando zshpara eliminar los archivos:

rm ~/tmp/**/*(.-m+0)

Agregando a cron:

00 */3 * * * /usr/bin/zsh -c 'rm ~/tmp/**/*(.-m+0)'
heemayl
fuente
6

Debería poder eliminar todos los archivos de más de 1 día de antigüedad /home/username/directoryy todos los directorios debajo de él con:

find /home/username/directory -type f -mtime +1 -delete

Y para programar ese comando cada tres horas, configúrelo como un trabajo cron:

crontab -e

Luego dentro del crontab:

0 */3 * * * find /home/username/directory -type f -mtime +1 -delete

Que ejecuta su comando cada tres horas en la hora (es decir, minuto 0), por lo que 3:00 a.m., 6:00 a.m., etc.

Vaya al crony crontab manpagespara más información sobre ellos.

Limecat
fuente
44
Esta respuesta es realmente incorrecta, por favor vea la otra respuesta .
44
Como esta respuesta es incorrecta y en realidad no dice nada más que la otra respuesta, mejore su respuesta para que sea correcta y mejor que la otra respuesta, o elimínela.
55
@ParanoidPanda Entiendo que quieres respuestas de alta calidad, pero comentar esencialmente lo mismo dos veces es innecesario y podría verse como agresivo, especialmente para un nuevo usuario.
RPiAwesomeness
2
@RPiAwesomeness: Bueno, comenté la segunda vez porque se me había acabado el tiempo para editar mi primer comentario, y también quería decir que deberían eliminar su respuesta, que tal vez no fue algo necesariamente entendido de mi primer comentario, aunque no quería que se sintieran atacados y, como decía, habían dado una respuesta incorrecta y ahora deben eliminarla, así que agregué un poco sobre la mejora. Pero puedo ver cómo se podría tomar esto de manera incorrecta, así que le pido que recuerde: un Panda solo se vuelve agresivo cuando le quita su bambú. ;-)