Bash Script para eliminar archivos más antiguos pero conservar los archivos más recientes, incluidos los subdirectorios

Bash Script para eliminar archivos más antiguos pero conservar los archivos más recientes, incluidos los subdirectorios

Estoy intentando eliminar archivos antiguos, pero debo conservar los archivos de registro de los últimos 3 días. Probé el siguiente comando:

ls -tr /home/httpd/htdocs/nombre de ruta/nombre de ruta/config//build/logs/aplicaciones/.log | cola -n +4 | xargs rm---

pero se eliminó, todos los archivos conservan solo 3 archivos en una carpeta. Pero quiero conservar 3 archivos en cada carpeta por separado.

¿Alguien puede ayudarme a resolver este problema?

Respuesta1

Puede intentar esto, colocar el siguiente contenido en un archivo de script de shell y ejecutarlo.

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

reemplácelo /tmp/testcon el nombre de su directorio.

Respuesta2

Podrías usar este comando:

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

O en bucle:

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

Dónde:

  • ls -t: enumera los archivos en orden decreciente de tiempo de modificación, un nombre de archivo por línea.
  • sed -e '1,3d': elimina las primeras 3 líneas
  • xargs -d '\n' rm: para cada línea de entrada (sin la nueva línea final), la pasa como argumento a rm.
  • -d '\n': esto es necesario por razones de eficiencia, para hacer que xargs considere cada línea de entrada como un argumento separado, pero pase tantos argumentos como quepan en una línea de comando a la vez, de modo que rm no se vuelva a invocar para cada uno.

Para más posibilidades ver el post Eliminar todos los archivos X excepto los más recientes en bash.

información relacionada