Elimine todos los archivos (excepto los cuatro más nuevos) en los directorios usando un script Bash

Elimine todos los archivos (excepto los cuatro más nuevos) en los directorios usando un script Bash

Estoy buscando un script Bash que ingrese a una lista de directorios y elimine todos los archivos creados menos los cuatro más recientes.

¿Cómo puedo hacer esto?

Respuesta1

ls -t | sed '1,4d' | xargs echo rm

Elimine el echocuando esté satisfecho con el resultado que desea.

Si tiene nombres de archivos con espacios, se requiere más trabajo.

Respuesta2

¿Quiere conservar los cuatro archivos más recientes de cada directorio o los cuatro archivos más recientes de CUALQUIER directorio?

Para resolver el primer problema, usaría buscar para enumerar cada directorio y luego, en cada uno, eliminaría todos los archivos menos los cuatro más recientes. Esto no es demasiado difícil.

Resolver el segundo problema requiere un poco más de reflexión, pero en realidad es más fácil de escribir.

Básicamente, busque cada archivo de forma recursiva. Llame al comando "stat" que devuelve la hora y el nombre de modificación del archivo. Ordene esto numéricamente descendente y omita los primeros cuatro archivos, que son los más recientes.

Luego elimine las marcas de tiempo principales y elimine la lista resultante de nombres de archivos.

Algo como (no probado):

#!/bin/bash

find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
    echo rm -v "${f}"
  done

Esto debería funcionar, aunque querrás eliminar el 'eco' en el bucle while para que sea efectivo. ¡Pruébelo con cuidado primero!

Respuesta3

Me doy cuenta de que esto no es exactamente lo que estás pidiendo, pero para este tipo de copia de seguridad prefiero rotar los archivos de registro antes de crear uno nuevo. Es un poco más explícito y mucho más sencillo de codificar, como este:

#!/bin/bash

#Archive old backups
move () {
  if [ -e $1 ]
  then
    echo "Archiving old backups: $1 to $2"
    mv -f $1 $2 || echo "FAILED"
  fi
}

#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz

#Now create today's backup
...

Respuesta4

El método más sencillo:

for d in dir1 dir2 dir3; do
  rm -vf `ls -1t $d | head -n-4` 
done

información relacionada