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?
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?
Respuestas:
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/[12]
, pero esto solo es realmente apropiado si los subdirectorios tienen nombres de letras únicas. En lo bash
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 usar bash
(realmente no recomiendo cambiarlo si no lo está).
ksh
, bash
y zsh
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
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.
tmpwatch
se ha bifurcado tmpreaper
, lo que (al menos en Debian) parece ser su reemplazo.
/a/b/c/
que no tenga que especificarse para cada opción?