Entfernen Sie Dateien, die älter als 5 Tage unter UNIX sind (Datum im Dateinamen, kein Zeitstempel).

10

Ich möchte Protokolldateien, die älter als 5 Tage sind, aus einem Verzeichnis löschen. Das Löschen sollte jedoch nicht auf dem Zeitstempel der Datei basieren. Es sollte auf dem Namen der Datei basieren. Für das Beispiel heutigen Datum 07.05.2012 ist und das Verzeichnis enthält 10 Dateien von Namen wie ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logusw. Ich mag die Dateien entfernen können , indem Sie das Datum aus dem Namen der Datei zu extrahieren.

Nalu
quelle

Antworten:

2

Basierend auf dem Datum des Dateinamens:

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
quelle
GNU Datumsbefehle funktionieren nicht .. :( Gibt es eine andere Möglichkeit, ein Datum zu erhalten, das 5 Tage vorher liegt?
Nalu
7

Ich denke, @oHessling hat es fast geschafft : Analysieren Sie ls nicht , und Sie können mehr in bash tun:

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
quelle
GNU Datumsbefehle funktionieren nicht .. :( Gibt es eine andere Möglichkeit, ein Datum zu erhalten, das 5 Tage vorher liegt?
Nalu
1
@Naren: Auf welchem ​​Betriebssystem bist du? Wenn Sie kein GNU-Datum haben, müssen wir wissen, was Sie haben.
Mat
Mit Hilfe von uname -a bekam die folgenden Informationen: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu
Die Frage bleibt: Welche Befehle stehen Ihnen zur Verfügung, um das aktuelle Datum abzurufen?
Bram
Wenn Tcl installiert ist:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
Glenn Jackman
1

Ein Weg mit perl:

Inhalt von 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];
    }   
}

Um es zu testen, erstelle ich einige Dateien:

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

Überprüfen Sie sie mit ls -1:

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

Führen Sie das Skript wie folgt aus:

perl script.pl *.log

Mit folgender Ausgabe:

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

Sie können stattdessen die Tatsache verwenden, dass Ihre Dateinamen in chronologischer Reihenfolge sortiert werden. Zum Beispiel, um die letzten 5 Dateien zu behalten:

ls ABC_????????.log | head -n-5 | xargs rm
Thomas
quelle
3
Verwenden Sie xargs nicht mit, es rmsei denn, Sie wissen, dass Sie jedes Mal Kätzchen töten. Es ist nur eine schlechte Idee, wenn Sie nicht wissen, warum Sie recherchieren und lernen, dass es immer bessere Möglichkeiten gibt, sich einem Problem zu nähern, für das dies eine Lösung sein könnte.
Caleb