2010-12-15 23 views
8

Tengo una carpeta que contiene algunas revisiones de revisión de subversión (estas se desprotegen cuando se ejecuta una receta de implementación de capistrano).cómo eliminar todos los archivos excepto los últimos tres en una carpeta

Lo que quiero hacer realmente es mantener las últimas 3 revisiones que comprueben el capistrano y eliminar otras, así que para esto estoy planeando ejecutar algún comando en la terminal usando un comando de ejecución, en realidad capistrano hasn ' Aquí tengo algo que hacer, pero un comando de Unix.

yo estaba tratando de ejecutar un comando para obtener una lista de los archivos excepto los tres castellano y eliminar el resto, podría obtener la lista de archivos utilizando el siguiente comando.

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs 

ahora si añado un rm-rf hasta el final de este comando me regresa con archivo no encontrado eliminar. entonces eso es obvio porque esto solo devuelve el nombre de la carpeta, no la ruta completa a la carpeta.

¿Hay alguna forma de eliminar estos archivos/carpetas utilizando un comando de Unix?

Respuesta

13

Muy bien, hay algunas cosas mal con su secuencia de comandos.

En primer lugar, y lo más problemático, es esta línea:

ls -t /var/path/to/folder |head -n 3; 

ls -t devolverá una lista de archivos con el fin de su última fecha de modificación, a partir de la más recientemente modificado. head -n 3 dice que solo enumere las primeras tres líneas. Entonces, lo que está diciendo es "dame una lista de solo los tres últimos archivos modificados", que no creo que sea lo que quieres.

No estoy muy seguro de lo que está haciendo con el segundo comando ls, pero estoy bastante seguro de que va a concatenar todos los archivos en el directorio en su lista. Eso significa que cuando se obtiene sort ed y uniq 'ed, se quedará con una lista alfabética de todos los archivos en ese directorio. Cuando esto pase a algo como xargs rm, borrará todo en ese directorio.

A continuación, sort | uniq no necesita la parte uniq. Puede simplemente usar el interruptor -u en sort para deshacerse de los duplicados. No necesitas esta parte de todos modos.

Finalmente, la eliminación real del directorio. En esa parte, que estaba en lo cierto en su pregunta: sólo tiene que utilizar rm -r

Aquí está la manera más fácil de lo que puedo pensar para hacer esto:

ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 

Aquí es lo que pasa aquí:

  • ls -t1 es imprimiendo una lista, un archivo/directorio por línea, de todos los archivos en /var/path/to/folder, ordenando por el más reciente fecha de modificación.
  • tail -n +4 es la impresión de todas las líneas en la salida del ls -t1 a partir de la cuarta línea (es decir,los tres archivos más recientemente modificados no serán enumerados)
  • xargs rm -r dice eliminar cualquier salida de archivo de la tail. El -r significa eliminar archivos de forma recursiva, por lo que si encuentra un directorio, eliminará todo en ese directorio y luego eliminará el directorio.

Tenga en cuenta que no estoy ordenando nada ni eliminando ningún duplicado. Esto se debe a:

  • ls sólo se informa de un archivo una vez, por lo que no hay duplicados para eliminar
  • va a eliminar todos los archivos pasado de todos modos, por lo que no importa en qué orden de que se eliminen.

hace todo eso tiene sentido?

Editar:

Ya que estaba equivocado acerca de ls especificando la ruta completa cuando se pasa un directorio absoluto, y puesto que es posible que no sea capaz de realizar una cd, tal vez usted podría utilizar tail lugar.

Por ejemplo:

ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r 
+0

Hola gracias por la respuesta, pero aún así obtener el archivo Sólo nombres, uno de mis principales necesidades es ejecutar el código desde cualquier directorio del servidor y eliminar los archivos de esa var/ruta/a/carpeta esto funciona bien si estoy en la misma carpeta var/ruta/a/carpeta – nivanka

+0

@nivanka: Eso es realmente extraño. ¿Estás especificando una ruta relativa o absoluta? Debe especificar una ruta absoluta si desea ejecutar esto desde cualquier directorio en el servidor. ¿Puedes copiar/pegar el comando * exact * que estás usando? – AgentConundrum

+0

hola, esto es lo que hago ls -t1/var/path/to/folder | cola -n +4 | xargs rm -r – nivanka

0

Hola he encontrado una manera de hacer esto podemos utilizar el UNIX & &

lo que el comando se verá así

cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 
1

continuación se muestra una forma útil de hacer la tarea ....... !!

para Linux y HP-UX:

ls -t1 | cola -n +50 | xargs rm -r # para dejar los últimos 50 archivos/directorios.

para SunOS:

rm `(ls -t | cabeza -n 100; ls) | tipo | uniq -u`

Cuestiones relacionadas