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

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Lord_x, 19.09.2013.

  1. Lord_x

    Lord_x Guest

    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 HeadCrash, 19.09.2013
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    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
     
  4. #3 Spröde, 19.09.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Datum mit date in Unix-Time umrechnen lassen und in Sekunden rechnen.
     
  5. Lord_x

    Lord_x Guest

    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.
     
  6. #5 Spröde, 19.09.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Äh? Zeig doch mal, was beim ersten Dateinamen rauskommen soll. Den Spaß mache ich mir jetzt, Dir auf Deinem Holzweg zu helfen.
     
  7. Lord_x

    Lord_x Guest

    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".
     
  8. #7 bitmuncher, 20.09.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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
    
     
  9. #8 Spröde, 20.09.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    @bitmuncher: Vergiss nicht, dass er den Namen am Ende wieder zusammensetzen will. :D
     
  10. #9 bitmuncher, 20.09.2013
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    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.
     
  11. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  12. Lord_x

    Lord_x Guest

    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.
     
  13. #11 Spröde, 21.09.2013
    Zuletzt bearbeitet: 21.09.2013
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    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.
     
Thema: Datum im Dateiname auslesen und dann nach X Tagen löschen?
Besucher kamen mit folgenden Suchen
  1. unix dateiname auslesen

    ,
  2. bash datum aus dateinamen extrahieren

Die Seite wird geladen...

Datum im Dateiname auslesen und dann nach X Tagen löschen? - Ähnliche Themen

  1. Dateien filtern, die kein Datum im Dateinamen haben - wie?

    Dateien filtern, die kein Datum im Dateinamen haben - wie?: Guten Morgen :) Ich habe ein Sicherungsscript vorgesetzt bekommen, mit der Aufgabe, dass es jetzt auf einmal nicht mehr alle Dateien in einem...
  2. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  3. Wie kann ich im AIX x Tage vom Datum subtrahieren ?

    Wie kann ich im AIX x Tage vom Datum subtrahieren ?: Für ein Skript unter AIX brauche ich einen Code, der mir vom aktuellen Datum 7 Tage abzieht und das Datum im gewünschten Format ausgibt. Hat...
  4. Wie filtere ich nach Datum um Files zu löschen

    Wie filtere ich nach Datum um Files zu löschen: Ich möchte alle *.sql Dateien löschen die älter als 20 Tage sind. Die Verbindung mache ich von einem RedHat auf eine Windows 2008 Server....
  5. Dateien nach Datum finden

    Dateien nach Datum finden: Hallo zusammen, ich würde gerne Wissen wie ich am einfachsten Dateien nach einem bestimmten Datum in einem Verzeichnis suchen kann. Das...