Cron trabajo para eliminar archivos de más de 3 días


21

Necesito eliminar archivos de más de 3 días con un trabajo cron en 3 directorios diferentes. (estos 3 directorios son hijos de un directorio padre /a/b/c/1y /a/b/c/2& /a/b/c/3) ¿Se puede hacer esto con una línea en el crontab?

Respuestas:


26

Esto es bastante fácil (aunque tenga en cuenta que esto pasa por un tiempo de modificación hace más de 3 días ya que el tiempo de creación solo está disponible en ciertos sistemas de archivos con herramientas especiales):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

Elimine el #antes -deleteuna vez que esté seguro de que está encontrando los archivos que desea eliminar.

Para que lo ejecute cron, probablemente solo cree un script ejecutable (agregue un shebang - #!bin/sha la línea superior del archivo y lo ejecute con chmod a+x), luego lo coloque en un crondirectorio apropiado como /etc/cron.dailyo /etc/cron.weekly. Siempre que no necesite un horario más específico y que estos directorios existan en su distribución.

Actualizar

Como se indica a continuación, la -deleteopción para findno es muy portátil. Un enfoque compatible con POSIX sería:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

Nuevamente, elimine #cuando esté seguro de tener los archivos correctos.

Actualización2

Para citar el comentario de Stéphane Chazelas a continuación:

Tenga en cuenta que -exec rm {} +tiene vulnerabilidades de condición de carrera que -delete(cuando está disponible) no tiene. Así que no lo use en directorios que otros puedan escribir. Algunos hallazgos también tienen un -execdirfactor que mitiga esas vulnerabilidades.


¡Gracias! ¿Hay alguna manera de especificar el directorio principal y luego los directorios secundarios para /a/b/c/que no tenga que especificarse para cada opción?
KingKongFrog

Claro, en un shell POSIX puede hacerlo /a/b/c/[12], pero esto solo es realmente apropiado si los subdirectorios tienen nombres de letras únicas. En lo bashque puedes hacer /a/b/c/{1,2}. Por supuesto, entonces la línea de explosión para un script debería ser #!/bin/basho si está usando crontab, debe asegurarse de que esté configurado para usar bash(realmente no recomiendo cambiarlo si no lo está).
Graeme

2
La expansión de llaves es una característica de csh y también es compatible con ksh, bash, zsh y fish, por lo que tiene una amplia variedad de shells. ksh, bashy zshtambién tienen operadores de alternancia en sus globos. Tenga en cuenta que -exec rm {} +tiene vulnerabilidades de condición de carrera que -delete(cuando está disponible) no tiene. Por lo tanto, no lo use en directorios que otros puedan escribir. Algunos hallazgos también tienen un -execdirque mitiga esas vulnerabilidades.
Stéphane Chazelas

¿ rm -fNo maneja los errores en silencio, por lo tanto, maneja cualquier posible condición de carrera con -exec?
Acumenus


9

Sería mucho mejor usar tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.

2
tmpwatchse ha bifurcado tmpreaper, lo que (al menos en Debian) parece ser su reemplazo.
Jaap
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.