2011-01-27 17 views
11

Es difícil de explicar en el título.Script Bash para eliminar todos los archivos, excepto N, ordenados alfabéticamente

Tengo un script bash que se ejecuta diariamente para hacer una copia de seguridad de una carpeta en un archivo zip. Los archivos zip se denominan worldYYYYMMDD.zip con YYYYMMDD siendo la fecha de la copia de seguridad. Lo que quiero hacer es eliminar todas menos las 5 copias de seguridad más recientes. Al ordenar los archivos alfabéticamente se enumerarán primero los más antiguos, así que básicamente necesito eliminar todos menos los últimos 5 archivos ordenados alfabéticamente.

+0

¿Se debe hacer manualmente cuando sienta que tiene demasiadas copias de seguridad, o cada vez que se ejecuta el script bash? – cledoux

+0

@ chaz8705 Lo usaré en ambos sentidos – sgtFloyd

+0

Tenga en cuenta que la mayoría de estas respuestas fallarán con los nombres de archivo que contienen espacios. –

Respuesta

18

La siguiente línea debería hacer el truco.

ls -F world*.zip | head -n -5 | xargs rm 
  • ls -F: una lista de los archivos alfabéticamente
  • head -n -5: filtrar todas las líneas excepto la última 5
  • xargs rm: eliminar un fichero.
+2

er ... incluyen 'ls -AF world * .zip' sería mejor. – Benoit

+0

@Benoit, gracias, actualizado! – aioobe

+1

'ls -F' agrega cruxt al final del nombre de archivo y no debe usarse. '-A' no es necesario ya que ninguno de los archivos está oculto. –

3

¿Qué tal esto:

find /your/directory -name 'world*.zip' -mtime +5 | xargs rm 

prueba antes. Esto debería eliminar todos los archivos world*.zip anteriores a 5 días. Entonces una lógica diferente a la que tienes.

+0

Aunque esto tiene más sentido, no quiero eliminar en función de la fecha del archivo. Si el script de copia de seguridad falla, aún quiero mantener el 5 más reciente, por lo que la respuesta de aioobe es la mejor para mí. – sgtFloyd

+0

{} realmente debería estar escapado o entre comillas. Sé que funciona en este caso, pero sigue siendo una buena práctica y recomendada por la página de manual. – cledoux

+0

@ chaz8705 - editado con xargs – eumiro

0
ls | grep ".*[\.]zip" | sort | tail -n-5 | while read file; do rm $file; done 
  • sort ordena los archivos
  • tail -n-5 declaraciones de todos, pero el más reciente 5
  • el bucle while qué el
  • borrar
+1

No. Esto eliminará 5 archivos. El autor quiere todos menos 5 y grep -c cuenta archivos. – Benoit

+0

@Benoit Fue un error tipográfico que he corregido. – marcog

+1

probablemente no 'echo world * .zip | ordenar | cola -n -5 | xargs rm' es más eficiente. – Benoit

1

no puede probar que en este momento porque Don No tengo una máquina Linux, pero creo que debería ser:

rm `ls -A | head -5` 
0

ls world*.zip | sort -r | tail n+5 | xargs rm

sort -r clasificará en orden inverso, por lo que la más reciente estará en el

tail n+5 principales líneas de salida voluntad, empezando por el quinto

xargs rm eliminará los archivos. Xargs se usa para pasar stdin como parámetros a rm.

+0

'grep' es innecesario. –

+0

editado, y agregué el cheque para el mundo * mientras estaba en ello. – cledoux

Cuestiones relacionadas