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
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
@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
hola, esto es lo que hago ls -t1/var/path/to/folder | cola -n +4 | xargs rm -r – nivanka