%20en%20los%20directorios%20usando%20un%20script%20Bash.png)
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 echo
cuando 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