¿Cómo encontrar y eliminar archivos anteriores a días específicos en Unix?


38

Tengo una carpeta para el registro con 7 carpetas. Esas siete carpetas también tienen subcarpetas y esas subcarpetas también tienen subcarpetas. Quiero eliminar todos los archivos de más de 15 días en todas las carpetas, incluidas las subcarpetas, sin tocar la estructura de carpetas, eso significa solo archivos.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Respuestas:


54

Podrías comenzar diciendo find /var/dtpdev/tmp/ -type f -mtime +15. Esto encontrará todos los archivos de más de 15 días e imprimirá sus nombres. Opcionalmente, puede especificar -printal final del comando, pero esa es la acción predeterminada. Es recomendable ejecutar primero el comando anterior para ver qué archivos están seleccionados.

Después de verificar que el findcomando enumera los archivos que desea eliminar (y no otros), puede agregar una "acción" para eliminar los archivos. Las acciones típicas para hacer esto son:

  1. -exec rm -f {} \;(o, equivalentemente -exec rm -f {} ';')
    Esto se ejecutará rm -fen cada archivo; p.ej,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Esto se ejecutará rm -fen muchos archivos a la vez; p.ej,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    por lo tanto, puede ser un poco más rápido que la opción 1. (Es posible que deba ejecutarse rm -fvarias veces si tiene miles de archivos).

  3. -delete
    Esto se dice a findsí mismo para eliminar los archivos, sin ejecutar rm. Esto puede ser infinitesimalmente más rápido que las -execvariantes, pero no funcionará en todos los sistemas.

Entonces, si usa la opción 2, todo el comando sería:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

Usar -delete es más simple (la sintaxis y ningún proceso hijo se genera para eliminar) pero puede no funcionar en todos los sistemas. rm -f {} + es lo mejor, eliminará archivos en lotes si hay suficientes archivos para ser demasiado para una línea de comandos. rm -f {} ';' dará un error de comando demasiado largo si hay suficientes archivos para ser demasiado para una línea de comando.
gaoithe

-1

O hazlo con un bucle:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Esto no funcionará con archivos con espacios en ellos.
Drav Sloan

En su lugar, puede usar un bucle while que debería ocuparse de los archivos con espacios. find / var / dtpdev / tmp / -type f -mtime +15 | mientras lee x; hacer rm "$ x"; hecho
David Okwii
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.