Supprimer les fichiers de plus de 5 jours sous UNIX (date dans le nom du fichier, pas horodatage)

10

Je souhaite supprimer des fichiers journaux datant de plus de 5 jours d'un répertoire. Mais la suppression ne doit pas être basée sur l'horodatage du fichier. Il doit être basé sur le nom du fichier. Pour la date de l' exemple est 07/05/2012 et le répertoire contient 10 fichiers de noms tels que ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logetc. Je veux être en mesure de supprimer les fichiers en extrayant la date à partir du nom du fichier.

Nalu
la source

Réponses:

2

Basé sur la date du nom de fichier:

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
la source
Les commandes de date GNU ne fonctionnent pas .. :( Une autre façon d'obtenir la date qui est 5 jours avant?
Nalu
7

Je pense que @oHessling l'a presque : Ne pas analyser ls , et vous pouvez faire plus 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
la source
Les commandes de date GNU ne fonctionnent pas .. :( Une autre façon d'obtenir la date qui est 5 jours avant?
Nalu
1
@Naren: sur quel OS êtes-vous? Si vous n'avez pas de date GNU, nous devons savoir ce que vous avez.
Mat
Avec l'aide d'uname -a a obtenu les informations suivantes: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu
La question demeure: de quelles commandes disposez-vous pour obtenir la date actuelle?
Bram
Si Tcl est installé:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
glenn jackman
1

À sens unique en utilisant perl:

Contenu 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];
    }   
}

Pour le tester je crée quelques fichiers:

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

Vérifiez-les avec ls -1:

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

Exécutez le script comme:

perl script.pl *.log

Avec sortie suivante:

File ABC_20120320.log deleted
File ABC_20120430.log deleted
File ABC_20120502.log deleted
Birei
la source
-1

À la place, vous pouvez utiliser le fait que vos noms de fichiers seront triés par ordre chronologique. Par exemple, pour conserver les 5 derniers fichiers:

ls ABC_????????.log | head -n-5 | xargs rm
Thomas
la source
3
N'utilisez pas de xargs à rmmoins que vous ne sachiez que vous tuez des chatons à chaque fois. C'est juste une mauvaise idée, si vous ne savez pas pourquoi faire des recherches et apprendre qu'il existe toujours de meilleures façons d'aborder tout problème pour lequel cela pourrait être une solution.
Caleb