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?
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:
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.
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.
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.
/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á).
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.
rm -fNo 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.
tmpwatchse 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?