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/1
y /a/b/c/2
& /a/b/c/3
) ¿Se puede hacer esto con una línea en el crontab?
fuente
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/1
y /a/b/c/2
& /a/b/c/3
) ¿Se puede hacer esto con una línea en el crontab?
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 -delete
una 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/sh
a la línea superior del archivo y lo ejecute con chmod a+x
), luego lo coloque en un cron
directorio apropiado como /etc/cron.daily
o /etc/cron.weekly
. Siempre que no necesite un horario más específico y que estos directorios existan en su distribución.
Como se indica a continuación, la -delete
opción para find
no 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.
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-execdir
factor que mitiga esas vulnerabilidades.
/a/b/c/
que no tenga que especificarse para cada opción?/a/b/c/[12]
, pero esto solo es realmente apropiado si los subdirectorios tienen nombres de letras únicas. En lobash
que puedes hacer/a/b/c/{1,2}
. Por supuesto, entonces la línea de explosión para un script debería ser#!/bin/bash
o si está usando crontab, debe asegurarse de que esté configurado para usarbash
(realmente no recomiendo cambiarlo si no lo está).ksh
,bash
yzsh
tambié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-execdir
que mitiga esas vulnerabilidades.rm -f
No maneja los errores en silencio, por lo tanto, maneja cualquier posible condición de carrera con-exec
?Sería mucho mejor usar
tmpwatch
fuente
tmpwatch
se ha bifurcadotmpreaper
, lo que (al menos en Debian) parece ser su reemplazo.