Eliminar archivos anteriores a X días +


143

He encontrado el comando para eliminar archivos de más de 5 días en una carpeta

find /path/to/files* -mtime +5 -exec rm {} \;

Pero, ¿cómo hago esto también para subdirectorios en esa carpeta?


¿Te refieres a los archivos dentro de los subdirectorios? o los subdirectorios mismos?
rahul

3
find /path/to -type d -empty -delete
Costas

2
Eliminar archivos en subdirectorios que también tienen más de 5 días de antigüedad
Teddy291

3
Posiblemente divertido cuando tengo archivos con espacios. Por ejemplo, un archivo llamado "prueba uno" y rm se alimenta rm test one. (Que eliminará un archivo llamado "prueba" y un archivo llamado "uno", pero no un archivo llamado "prueba uno"). Sugerencia: -delete or -print0
Hennes

66
Como nota al margen, siempre cite el argumento proporcionadofind para evitar problemas con caracteres especiales, como se menciona en la primera línea de la respuesta. Por ejemplo:find /path/to/files/ -exec somecommand '{}' \;
Walf

Respuestas:


240

Tenga cuidado con los nombres de archivos especiales (espacios, comillas) cuando vaya a rm.

Existe una alternativa segura: la opción -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Eso es todo, no hay llamadas rm separadas y no necesita preocuparse por los nombres de los archivos.

Reemplace -deletecon -depth -printpara probar este comando antes de ejecutarlo ( -deleteimplica -depth).


23
También se usa -type fpara eliminar archivos solamente (y mantener subdirectorios)
Oleg

3
Alternativamente, si desea hacer lo mismo para todos los archivos MÁS NUEVOS que cinco días: busque / ruta / al / directorio / -mindepth 1 -mtime -5 -delete
zmonteca

Si mi camino contiene espacios, ¿cómo debo hacerlo? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio

3
@ uom-pgregorio Sugeriría poner la ruta entre comillas.
atripes

44
Tenga en cuenta que cada findargumento es un filtro que utiliza el resultado del filtro anterior como entrada. Así que asegúrese de agregar -delete como último argumento. IE: find . -delete -mtime +5eliminará TODO en la ruta actual.
Johan

15

Tenga en cuenta que este comando no funcionará cuando encuentre demasiados archivos. Producirá un error como:

bash: /usr/bin/find: Argument list too long

Lo que significa que se excedió el límite de la llamada del sistema ejecutivo en la longitud de una línea de comando. En lugar de ejecutar rm de esa manera, es mucho más eficiente usar xargs . Aquí hay un ejemplo que funciona:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Esto eliminará todos los archivos (tipo f) modificados hace más de 14 días en / root / Maildir / recursivamente desde allí y más profundo (profundidad 1). Consulte el manual de búsqueda para obtener más opciones .


77
Según la respuesta de @ AfshinHamedi en AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), tenga cuidado con los archivos que contienen líneas nuevas y caracteres especiales. En su lugar usefind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe

2
O simplemente agregue '+' a los resultados de búsqueda
Dani_l

8

Es lo mismo. Solo tiene que proporcionar el directorio principal en lugar del prefijo de los archivos. En su ejemplo, sería:

find /path/to -type f -mtime +5 -exec rm {} \;

Esto eliminará todos los archivos con más de 5 días de antigüedad /path/toy sus subdirectorios.

Para eliminar subdirectorios vacíos, consulte el comentario de @Costas arriba.


44
Tenga en cuenta que para todos y cada uno de los archivos ejecutará el comando rm. Si tiene 1000 archivos de más de 5 días, rm comenzará 1000 veces. Por esta razón, considere la opción -delete como en el comentario de Costa o -exec rm {} \ +
Hennes

@Hennes: - 1) no estoy seguro de que necesites escapar +en ese caso. - 2) mejor escribir -exec rm '{}' +para defenderse del mal de los archivos con caracteres especiales (espacios, líneas nuevas, etc.) en su nombre.
Cbhihe

-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.