Eliminar archivos con más de 30 días

8

Tengo una carpeta de caché con un mínimo de 15000 archivos.

Intenté esto:

find cache* -mtime +30 -exec rm {} \;

¡Pero esto hizo que la carga de mi servidor vuele a los cielos!

¿Hay alguna solución más rápida / mejor ?

¿O puedo limitar la velocidad o las iteraciones de este comando?

Kristian
fuente
1
Si se cache*expande a muchos archivos, puede probar algo como en su find . -name 'cache*' -mtime +30 -exec rm {} \;lugar.
Jaap Eldering

Respuestas:

10

Me gusta usar tmpwatchpara estas cosas, esta es la última vez que se modificó el archivo. Es simple y funciona bien en muchos casos:

tmpwatch -m 720 /path/to/cache

Para Ubuntu, verifique en su tmpreaperlugar.

Si desea verificar la última vez que se accedió al archivo, utilice lo siguiente:

tmpwatch -a 720 /path/to/cache

No puede usar tmpwatch -a en sistemas de archivos montados con noatime. todavía puedes usar -m

WojonsTech
fuente
Estoy usando Ubuntu 10.04.2 LTSy ese comando no existe ...
Kristian
2
@Kristian Check para en su tmpreaperlugar.
slhck
¿Alguna dificultad al usarlos para administrar sistemas de archivos montados con la opción noatime?
AnonymousLurker
@AnonymousLurker He modificado la respuesta para usted
WojonsTech
6

Puede evitar que se genere un nuevo proceso para cada archivo utilizando

find cache* -mtime +30 -delete
chiborg
fuente
3

Intenta ejecutar lo anterior con nice:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

De esa forma, la gran carga solo aparecerá si no se necesita ejecutar nada más; de lo contrario, los otros procesos tendrán prioridad (si su simplicidad es inferior a 19, es decir, el máximo).

Tenga en cuenta que el argumento de la opción -n se agrega a la simplicidad predeterminada que varía entre -20 y 19. Utilicé 39 para que sea muy agradable independientemente de la simpatía original que haya.

DanielFetchinson
fuente
2

Como comentó chiborg, la carga se debe al inicio de rm para cada archivo encontrado. Noté la respuesta donde tmpwatchse sugiere como alternativa, que estoy seguro funciona bien. Sin embargo, no es necesario.

Find puede ejecutar el comando dado a exec una vez, si le dice que acumule los archivos encontrados en una lista de argumentos así:

find /path -name "*.moo" -exec rm {} \+

Esto a veces puede fallar porque la lista de argumentos puede crecer (en bytes) más que el máximo permitido por el shell (getconf ARG_MAX). Esto puede resolverse mediante xargs con la opción -L.

considera este ejemplo:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

Por lo tanto, no es necesario instalar software adicional, todo lo que necesita está en gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 
Ярослав Рахматуллин
fuente
algunos d00d pensaron que sería útil agregar -print0 y -0 para encontrar y xargs. Esos argumentos obligan a sus comandos a usar el carácter nulo (\ 0) en lugar de una nueva línea (\ n) para separar los argumentos. Esto es útil cuando el nombre del archivo tiene espacios o líneas nuevas.
Ярослав Рахматуллин
(1) No necesitas decirlo \+; claro +es lo suficientemente bueno. (2) Esto no "dejará de funcionar porque la lista de argumentos puede crecer ...".  find  … -exec … {} +hará lo mismo que xargshará; ejecutará el comando tantas veces como sea necesario. Por ejemplo (como en su ejemplo), si tiene entre 15001 y 20000 archivos, findejecutaría el -execprograma 'd ( rm) cuatro veces.
G-Man dice 'reinstalar a Mónica' el