[SOLUCIONADO] Script para eliminar los archivos de una carpeta en un directorio menos los 23 más recientes

Imagen de tenteyu
0 puntos

Hola a tod@s:

Tengo una carpeta llamada "datos" en un directorio donde cada hora llega un archivo nuevo.
Necesito hacer un programa que realice la siguiente tarea:
- Listar y ordenar cronológicamente los archivos de la carpeta.
- Borrar todos los ficheros de esta carpeta menos los 23 archivos más recientes.
Este programa lo quiero incluir en un cron para que se ejecute cada hora de forma automática.

He probado con el siguiente código:
#!/bin/csh
ls -t /home/user/entradas/datos | head -n 23;ls | sort | uniq -u | xargs rm
exit

El problema que me da es que cuando lo ejecuto, también se borran todos los archivos en el subdirectorio /home/user/entradas que están fuera de la carpeta "datos". Además, aparece un mensaje en el terminal con el listado de los archivos que no ha eliminado (el corte lo hace bien), pero en realidad no elimina nada porque la carpeta "datos" está como al principio.
¿Qué puedo estar haciendo mal? ¿Alguna corrección?

Gracias de antemano!!!

Imagen de slap
+1
0
-1

Hola.

Estás haciendo mal varias cosas.

Tu script tiene dos comandos (están separados por un ";"):
ls -t /home/user/entradas/datos | head -n 23
ls | sort | uniq -u | xargs rm

que son ejecutados uno después del otro.
El primero obtiene un listado de archivos del directorio /home/user/entradas/datos ordenados por la fecha/hora de modificación del archivo (los más nuevos primero). De este listado se muestran sólo los 23 primeros (eso lo hace el "head -n 23". El resultado se muestra en pantalla.

El segundo obtiene un listado de archivos del directorio donde estás ejecutando el script (orden "ls") ordenados por el nombre ("sort" sin parámetros), esa salida se la pasas a "uniq" que mostrará sólo los nombres que no coincidan (es decir: TODOS, ya que no puede haber dos archivos con el mismo nombre en el mismo directorio). Y, por último, la salida de "uniq" se la pasas a "xargs" con el parámetro "rm" (es decir: borra TODOS los archivos del directorio donde ejecutas el script).

Solución:
ls -t /home/user/entradas/datos | head -n 23 | xargs rm

¡Ojo! Este comando tendrá problemas con nombres de archivo que contengan espacios.

Solución:
ls -tQ /home/user/entradas/datos | head -n 23 | xargs rm

Más info:
man ls
man head
man xargs

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de tenteyu
+1
0
-1

Muchísimas gracias, tiene buena pinta y no puede estar mejor explicado ;-)
Hasta mañana no puedo probarlo, ya os contaré.

+1
0
-1
Imagen de tenteyu
+1
0
-1

He probado el script tal y como sugieres en la solución 1:

#!/bin/csh
ls -t /home/user/entradas/datos | head -n 23 | xargs rm
exit

pero al ejecutarlo aparece el siguiente mensaje en pantalla, para todos y cada uno de los archivos contenidos en el subdirectorio "datos" que quiero vaciar:
rm: no se puede borrar «20120509_1000e.sac»: No existe el archivo o el directorio

Sin embargo los archivos sí existen, de hecho no se han borrado... además cuando pruebo a borrar cualquiera de ellos usando rm archivo a borrar desde el terminal, se borra sin problemas, y los nombres de los archivos no llevan caracteres extraños que no se reconozcan......¿qué está ocurriendo?

+1
0
-1
Imagen de slap
+1
0
-1

No sé si puede ser por usar csh.
Prueba a cambiar la primera línea por:
#!/bin/bash

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es

Imagen de tenteyu
+1
0
-1

Me pasaban 2 cosas:
- Con esto estoy eliminando los 23 primeros, no eliminar todos menos los 23 primeros como yo quería.
- El mensaje de "no existe el archivo o directorio" aparece porque trata de buscar los ficheros en el directorio donde estoy ejecutando el script, no en el directorio donde se encuentran la carpeta datos.

+1
0
-1
Imagen de slap
+1
0
-1

Lo de que te borra los 23 primeros es cierto. Fallo mío al no leer bien el enunciado de lo que querías.

Lo de que te está buscando los ficheros en el directorio donde se ejecuta el script no es posible si estás poniendo una ruta absoluta.

Solución:
ls -t /home/user/entradas/datos | head -n -23 | xargs rm

Así, borrará todos menos los 23 más recientes y da igual desde donde ejecutes el script, siempre buscará en /home/user/entradas/datos.

Como veo que ya has marcado el post como solucionado, sería bueno, para que los demás conozcan tu solución, que la pongas en el post.

+1
0
-1

Saludos.

0000 start out (+FD),A
           ld  BC, +7FFF
           jp 03CB, RAM-CHECK

http://www.injiniero.es