¿Cómo eliminar todos los archivos de más de 3 días cuando la “lista de argumentos es demasiado larga”?

89

Tengo un directorio de archivos de registro que tiene 82000 archivos y directorios (aproximadamente la mitad y la mitad).

Necesito eliminar todos los archivos y directorios que tengan más de 3 días.

En un directorio que tiene 37000 archivos, pude hacer esto con:

find * -mtime +3 -exec rm {} \;

Pero con 82000 archivos / directorios, aparece el error:

/ usr / bin / find: lista de argumentos demasiado larga

¿Cómo puedo evitar este error para poder eliminar todos los archivos / directorios que tienen más de 3 días?

Edward Tanguay
fuente
1
¿Usted ha intentado find -mtime +3 -exec rm {} +?
Gilles Quenot
1
Creo que correr find * -mtime +3 |xargs rmsolucionaría ese problema.
Mats Petersson
9
Creo que el único problema es find *. find .es mejor. El shell globing con expande *a una enorme lista de archivos y directorios.
ruido sin
@artlessnoise es perfecto.
sjas

Respuestas:

120

Para eliminar todos los archivos y directorios dentro del directorio actual :

find . -mtime +3 | xargs rm -Rf

O alternativamente, más en línea con el comando original del OP:

find . -mtime +3 -exec rm -Rf -- {} \;
hd1
fuente
26
-1 El problema es la estrella en "buscar *", lo resolvió usando "buscar". en lugar. Xargs es engañoso aquí.
Aleksandr Levchuk
7
@AleksandrLevchuk resuelve el problema de OP y, por lo tanto, no merece un
voto negativo
11
Pregunta: "buscar * -mtime +3 -exec rm {} \;" da una lista de argumentos demasiado larga. Respuesta: Utilice "buscar. -Mtime +3 -exec rm {} \;"
Aleksandr Levchuk
2
Es posible que desee agregar --después de rm, comofind . -mtime +3 -exec rm -- {} \;
domen
8
Nadie dijo para qué --sirve.
Acumenus
59

También puede utilizar:

find . -mindepth 1 -mtime +3 -delete

Para no eliminar el directorio de destino

vangheem
fuente
4
La mejor respuesta, mucho más limpia que llamar a rm (y probablemente más segura). También funciona para subdirectorios.
básico 6 de
16

Otra solución para la pregunta original, esp. útil si desea eliminar solo ALGUNOS de los archivos más antiguos en una carpeta, sería algo como esto:

find . -name "*.sess" -mtime +100 

y así sucesivamente ... Las comillas bloquean los comodines de shell, lo que le permite "encontrar" millones de archivos :)

62mkv
fuente