Datum im Dateiname auslesen und dann nach X Tagen löschen?

L

Lord_x

Hallo zusammen

Ich habe in einem Verzeichnis mehere Dateien nach folgendem Schema:
Code:
test_file-20130801121000
test_file-20130801191000
test_file-20130802121000
test_file-20130802191000
test_file-20130805121000
test_file-20130805191000
test_file-20130806121000
test_file-20130806191000
test_file-20130807121000
test_file-20130807191000
test_file-20130808121000
test_file-20130830121000
test_file-20130830191000
test_file-20130831121000
test_file-20130831191000
test_file-20130901121000
test_file-20130901191000
test_file-20130902121000
test_file-20130902191000
test_file-20130903121000
test_file-20130903191000
test_file-20130904121000
test_file-20130904191000
test_file-20130905121000
test_file-20130905191000
test_file-20130906121000
test_file-20130906191000
test_file-20130907121001
test_file-20130907191000
test_file-20130908121000
test_file-20130908191000
test_file-20130909121000
test_file-20130909191000
test_file-20130910121001
test_file-20130910191000
test_file-20130911121000
Ich möchte jetzt erreichen, dass ich ältere Dateien als X löschen kann. Ich möchte dies am liebsten mit "awk" lösen. Leider habe ich im Moment keinen so richtig guten Anfangspunkt.

Meine Idee war, dass ich zuerst mit "awk split" beim "-" trenne und dann mit "date" das Datum einfach minus Datum X rechne. Leider bin ich nicht weit gekommen.

Kann mir jemand einen Tipp geben?

Danke
Gruss
 
Kleiner Tipp: das Rad nicht neu erfinden.
Was spricht gegen "find" oder "cfengine"?

Plus das Rechnen mit Daten, grade im obigen Format ist keine schöne Sache
z.B.: 20131909 - 10 = 20131899

mfg
HeadCrash
 
Datum mit date in Unix-Time umrechnen lassen und in Sekunden rechnen.
 
Das mit dem Datum rechnen ist nicht mein Problem sondern, dass ich dafür den Dateinamen splitten muss, mit dem hinteren Teil das Datum berechnen und dann den Namen wieder zusammensetzen muss.
 
Äh? Zeig doch mal, was beim ersten Dateinamen rauskommen soll. Den Spaß mache ich mir jetzt, Dir auf Deinem Holzweg zu helfen.
 
Dateiname?? Der gleiche wie vorher nur das ich alle auflisten will, welche älter als X Tage sind. Bei "date" gibt es den Parameter "-v" und damit kann ich dies problemlos berechnen. Natürlich kann ich das nur mit dem Teil "20130831121000" im Dateinamen durchführen. Der vordere Teil "test_file" kann sich aber auch mal ändern z.B. "prod_file".
 
Code:
bitmuncher@mbp2:~> echo 'test_file-20130904191000' | perl -e '$filename = <STDIN>; if($filename =~ /.*_.*-(.*)/) { print $1."\n"; }'
20130904191000
bitmuncher@mbp2:~> echo 'prod_file-20130904191000' | perl -e '$filename = <STDIN>; if($filename =~ /.*_.*-(.*)/) { print $1."\n"; }'
20130904191000
 
@bitmuncher: Vergiss nicht, dass er den Namen am Ende wieder zusammensetzen will. :D
 
Dazu braucht er nur eine Klammer mehr in der Regexe.

Code:
echo 'test_file-20130904191000' | perl -e '$filename = <STDIN>; if($filename =~ /(.*_.*-)(.*)/) { print "Datum: ".$2."\nRest des Dateinamens: $1\n"; }'

Oder wer es lieber kürzer und dafür unübersichtlicher mag:

Code:
echo 'test_file-20130904191000' | perl -e 'if(($f = <STDIN>) =~ /(.*_.*-)(.*)/) { print "Datum: ".$2."\nRest des Dateinamens: $1\n"; }'

Edit: Und ja, ich weiss dass man die Regexe noch ziemlich kürzen könnte indem man nur die Zahlen ab dem Ende des Strings sucht, aber ich denke so ist es etwas verständlicher.
 
@bitmuncher: Vergiss nicht, dass er den Namen am Ende wieder zusammensetzen will. :D
Sag mal du Flachwasser-Paddler, ausser "dumm labern" kannst du mindestens noch eine Sache! Ich glaube an dich! Dies wäre hier in diesem Fall einfach mal die Klappe halten! Danke

@bitmuncher
Danke habe jetzt eine Lösung mit awk gefunden.
 
Im flachen Wasser zu paddeln bedeutet, immer genug Luft fürs Gehirn zu haben. Dann kommt man auf Algorithmen für Erwachsene:
Code:
#!/bin/bash
x=5

n=$(($(date +%s)/86400))
while read f; do
    d=${f#*-};d=$(($(date -d "${d:0:8} ${d:8:2}:${d:10:2}:${d:12:2}" +%s)/86400))
    a=$(($n-$d))
    if ((a<=x)); then
        r=behalten
    else
        rm $f && r=geloescht || r="Fehler beim loeschen"
    fi
    echo "$f ist $a Tage alt -> $r"
done < <(ls -1)
Wie Du wahrscheinlich nicht bemerken wirst, gibt es da nichts zum "wieder zusammensetzen" und die komplette Aufgabe kann man in einem Zug lösen.

Aber gut: Du hast mir den Tag versüßt, ich habe selten so gelacht, vielen Dank. Dafür hast Du Dir eine Komplettlösung redlich verdient.


PS: Die von HeadCrash angedeutete Lösung ist natürlich um Klassen eleganter - falls die mtime der Dateien stimmt.
 
Zuletzt bearbeitet:

Ähnliche Themen

Inhalte in einer Datei suchen und Dateiname ausgeben

Löschen von Verzeichnissen älter als x Tage per Cron (Script)

Dateien loeschen die aelter als x tage sind

Löschen von diversen Unix Dateien älter x Tage und nur 3 Generationen

Löschen von Unix Dateien älter x Tage und nur 3 Generationen

Zurück
Oben