Eliminar archivos de más de 5 días en UNIX (fecha en el nombre del archivo, no marca de tiempo)

10

Quiero eliminar archivos de registro que tienen más de 5 días de un directorio. Pero la eliminación no debe basarse en la marca de tiempo del archivo. Debe basarse en el nombre del archivo. Para el ejemplo de hoy es la fecha 07/05/2012 y el directorio contiene 10 archivos de nombres como ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logetc quiero ser capaz de eliminar los archivos mediante la extracción de la fecha a partir del nombre del archivo.

Nalu
fuente

Respuestas:

2

Basado en la fecha del nombre del archivo:

THRESHOLD=$(date -d "5 days ago" +%Y%m%d)
ls -1 ABC_????????.log | 
  sed 'h;s/[_.]/ /g;G;s/\n/ /' | 
  while read A DATE B FILE
  do 
     [[ $DATE -le $THRESHOLD ]] && rm -v $FILE
  done
olibre
fuente
Los comandos de fecha GNU no funcionan ... :( ¿Alguna otra forma de obtener la fecha que es 5 días antes?
Nalu
7

Creo que @oHessling casi lo tiene: no analices ls , y puedes hacer más en bash:

four_days=$(date -d "4 days ago" +%Y%m%d)
for f in ABC_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].log; do
  date=${f#ABC_}
  date=${date%.log}
  (( $date < $four_days )) && rm "$f"
done
Glenn Jackman
fuente
Los comandos de fecha GNU no funcionan ... :( ¿Alguna otra forma de obtener la fecha que es 5 días antes?
Nalu
1
@Naren: ¿en qué sistema operativo estás? Si no tiene una fecha GNU, necesitamos saber qué tiene.
Mat
Con la ayuda de uname -a obtuve la siguiente información: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu
Queda la pregunta: ¿qué comandos tiene disponibles para obtener la fecha actual?
Bram
Si está instalado Tcl:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
Glenn Jackman
1

Una forma de usar perl:

Contenido de script.pl:

use warnings;
use strict;
use Time::Local qw/timelocal/;
use File::Spec;

## Process all input files.
while ( my $file = shift @ARGV ) { 

    ## Remove last '\n'.
    chomp $file;

    ## Extract date from file name.
    my ($date) = $file =~ m/.*_([^.]+)/ or next;

    ## Extract year, month and day from date.
    my ($y,$m,$d) = $date =~ m/(\d{4})(\d{2})(\d{2})/ or next;

    ## Get date in seconds.
    my $time = timelocal 0, 0, 0, $d, $m - 1, $y - 1900 or next;

    ## Get date in seconds five days ago.
    my $time_5_days_ago = time - 5 * 24 * 3600;

    ## Substract them, and if it is older delete it and print the
    ## event.
    if ( $time - $time_5_days_ago < 0 ) { 
        unlink File::Spec->rel2abs( $file ) and printf qq[%s\n], qq[File $file deleted];
    }   
}

Para probarlo, creo algunos archivos:

touch ABC_20120430.log ABC_20120502.log ABC_20120320.log ABC_20120508.log ABC_20120509.log

Compruébalos con ls -1:

ABC_20120320.log                                                                                                                                                                                                                             
ABC_20120430.log                                                                                                                                                                                                                             
ABC_20120502.log                                                                                                                                                                                                                             
ABC_20120508.log                                                                                                                                                                                                                             
ABC_20120509.log                                                                                                                                                                                                                             
script.pl

Ejecute el script como:

perl script.pl *.log

Con la siguiente salida:

File ABC_20120320.log deleted
File ABC_20120430.log deleted
File ABC_20120502.log deleted
Birei
fuente
-1

Lo que podría hacer es utilizar el hecho de que sus nombres de archivo se ordenarán en orden cronológico. Por ejemplo, para mantener los últimos 5 archivos:

ls ABC_????????.log | head -n-5 | xargs rm
Thomas
fuente
3
No uses xargs a rmmenos que sepas que estás matando gatitos cada vez que lo haces. Es una mala idea, si no sabes por qué investigar un poco y aprender que siempre hay mejores maneras de abordar cualquier problema para el que esto podría ser una solución.
Caleb