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!!!
Hola.Estás haciendo mal
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
Saludos.
http://www.injiniero.es
Muchísimas gracias, tiene
Muchísimas gracias, tiene buena pinta y no puede estar mejor explicado ;-)
Hasta mañana no puedo probarlo, ya os contaré.
He probado el script tal y
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?
No sé si puede ser por usar
No sé si puede ser por usar csh.
Prueba a cambiar la primera línea por:
#!/bin/bash
Saludos.
http://www.injiniero.es
[SOLUCIONADO] Script para eliminar los archivos de una carpeta e
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.
Lo de que te borra los 23
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.
Saludos.
http://www.injiniero.es
Borra datos mas antiguos
Hola ,
Os dejo un script que borra los archivos de mas de "X" tiempo .
#!/bin/sh
######################################################
#Nombre:borrado_backups.sh ##
#Autor: MCCR ##
#Fecha:Agosto 2017 ##
#Version:1.0 ##
######################################################
###############
# VARIABLES #
###############
LOG=/tmp/borrado.log #Este es el log
DATE=`date +%Y-%m-%d`
TARGET=$1 #Ubicacion de donde borra backups
BACKUP_DELETE_PERIOD=$2 #In days #Borra backups mas antiguos que este valor
###############
# EJEMPLO #
###############
#bash -x check_erased_by_time.sh [ruta ] [días] [todo lo que contenga]
# bash -x check_erased_by_time.sh /var/log/apache2/ 10 .gz
########
# MAIN #
########
echo "------------------------------------------" >> $LOG
echo "Comienza borrado backups antiguos: $DATE: " >> $LOG
echo "Borra Backups de hace mas de $BACKUP_DELETE_PERIOD dias" >> $LOG
find $TARGET -mtime +$BACKUP_DELETE_PERIOD -name "$3*" -execdir rm -rf {} \;
echo "Fin de ejecucion" >> $LOG
##Fin script