Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Dateien Löschen die älter als 10 Tage sind

  1. #1
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83

    Dateien Löschen die älter als 10 Tage sind

    Hi @all,

    ich würde gerne auf einem Verzeichnis Daten löschen die älter sind als 10 Tage.
    Leider kann ich nicht mit find -mtime arbeiten, da es mal sein kann, dass diese Daten bearbeitet werde und sich dann das Datum ändert.
    Die Dateiennamen sind aber mit dem Datum aufgebaut: dateiname_060609 --> Also dateiname_Jahr Monat Tag

    Gibt es eine Möglichkeit mit dem Dateinamen und das aktuelle Datum die Dateien zu finden die Älter sind als 10 Tage?
    Erst dachte ich mach Aktuellertag - Anlegedatum_Datei, aber das funkt nicht wirklich Hat mir jemand ein Tip?

  2. #2
    Derdernixzuentscheidenhat
    Registriert seit
    Jun 2005
    Ort
    Dortmund
    Beiträge
    547
    Hi,

    da wirst du dann wohl ein Skript schreiben müssen. Z. b. so:
    Code:
    declare -i zahl=10
    while [ $zahl -gt 1 ]
    do
            zahl=$((zahl-1))
            TAG=`date --date -$zahl\ days +%d`
            MONAT=`date --date -$zahl\ days +%m`
            JAHR=`date --date -$zahl\ days +%y`
    
            DATEI="XXXXXXX_"$TAG"_"$MONAT"_"$JAHR
            rm $DATEI
    done
    Musst du natürlich deinen Dateinamen entsprechend anpassen. Bei mir funktioniert das auch so, allerding wird da nix gelöscht, sondern kopiert.
    Wer alles verschiebt, ist noch lange nicht zukunftsorientiert. | Der Reiz der Ferne liegt nur in der Entfernung.

  3. #3
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83
    Hi,

    danke für dein Post und das Skript.
    Kannst mir noch kurz Erklären, wass in dieser Zeile Passiert:
    Code:
    TAG=`date --date -$zahl\ days +%d`
    Bei mir wird die Varibale nicht gefühlt?!
    Was macht das date --date -$zahl ? Soll das "\" ein "/" sein für eine Division?

  4. #4
    Derdernixzuentscheidenhat
    Registriert seit
    Jun 2005
    Ort
    Dortmund
    Beiträge
    547
    Hi,

    das \ maskiert eigentlich nur das Leerzeichen. Du könntest auch schreiben:
    Code:
    date --date "-3 days"
    oder
    date --date '-3 days'
    Dieses Konstrukt sollte dir den vorvorgestrigen Tag ausgeben. Normalerweise sollte in der Schleife die Variable $zaehl dekrementiert werden, sodass du die letzten zehn Tage erhalten solltest.

    Gibt denn "echo $DATEI" gar nix aus?
    Wer alles verschiebt, ist noch lange nicht zukunftsorientiert. | Der Reiz der Ferne liegt nur in der Entfernung.

  5. #5
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83
    Hi,

    ok jetzt verstehe ich. Dann Funktioniert das wie du es mir gezeigt hast.
    Code:
    declare -i zahl=5
    while [ $zahl -gt 1 ]
    do
            # Zahl dekremtieren
            zahl=$((zahl-1))
    
            TAG=`date --date -$zahl\ days +%d`
            MONAT=`date --date -$zahl\ days +%m`
            JAHR=`date --date -$zahl\ days +%y`
    
            DATEI="DATEINAME_"$JAHR""$MONAT""$TAG"_*.dmp"
            echo "rm $DATEI"
    done
    Dieser Code Generiert mir folgende Ausgabe:
    Code:
    rm DATEINAME_060627_*.dmp
    rm DATEINAME_060628_*.dmp
    rm DATEINAME_060629_*.dmp
    rm DATEINAME_060630_*.dmp
    rm DATEINAME_060701_*.dmp
    rm DATEINAME_060702_*.dmp
    rm DATEINAME_060703_*.dmp
    rm DATEINAME_060704_*.dmp
    rm DATEINAME_060705_*.dmp
    Vielleicht hatte ich mich falsch ausgedrückt, ich will alle Dateien löschen die älter sind als 10 Tage.
    Das skript generiert mir vom Vortag das Tatum und löscht dann nur 10 Dateien, wenn es dann noch ältere gibt, macht er das nicht.

  6. #6
    Derdernixzuentscheidenhat
    Registriert seit
    Jun 2005
    Ort
    Dortmund
    Beiträge
    547
    Hi,

    ja stimmt, hatte ich wohl überlesen. Allerdings fällt mir dazu dann auch nix ein. Was du evtl. noch machen könntest, wäre eben die Dateien der letzten 10 Tage irgendwo hin zu verschieben, die anderen zu löschen, und die verschobenen anschließend wieder zurückzuverschieben.
    Wer alles verschiebt, ist noch lange nicht zukunftsorientiert. | Der Reiz der Ferne liegt nur in der Entfernung.

  7. #7
    Unregistrierter Benutzer
    Registriert seit
    Apr 2003
    Ort
    nähe Forchheim
    Beiträge
    649
    Machs doch per find:
    Code:
    find /pfad/zum/Verzeichniss -type f \( -name '*.zip' \) -ctime +10 -exec ls {} \;
    Zum "scharf" machen einfach das ls durch rm ersetzen.
    Früher war alles besser. Vor allem die Zukunft

    Gruß @home

  8. #8
    Derdernixzuentscheidenhat
    Registriert seit
    Jun 2005
    Ort
    Dortmund
    Beiträge
    547
    Hi,

    aber genau das funktioniert doch nicht mehr, sobald eine Datei geändert wurde.
    Wer alles verschiebt, ist noch lange nicht zukunftsorientiert. | Der Reiz der Ferne liegt nur in der Entfernung.

  9. #9
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83
    @dingeling
    hab da nee idee, ich versuch es mal, wenn das klappt, poste ich das mal.

    @carstenj
    Leider funkt das mit dem -ctime nicht?!
    Wenn ich -ctime weg lasse findet er alle Dateien.
    Wär schon cool, wenn es mit dem Find funktionieren würde.

  10. #10
    Registrierter Benutzer
    Registriert seit
    Jun 2005
    Ort
    /home/brücke
    Beiträge
    253
    du könntest dir den derzeitigen Tag doch per date auf deine Form bringen, den speicherst du in ner Variablen, ziehst per sed aus deinen vorliegenden Dateinamen den Datums-string raus und vergleichst, wenn es kleiner jetzt und kleiner als datum vor 10 tagen dann rm.

    Kann leider zu wenig bash um das zu schreiben
    Saying that Java is nice because it works on all OS's is like saying that anal sex is nice because it works on all genders

  11. #11
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83
    Hi,

    also danke erst mal für eure Posts, hat mich schon weiter gebracht!
    Ich hab hier mal ein Kleines Skript geschrieben, dass sollte eigentlich funken, aber ich hab Probs beim Vergleich der Daten, bekomme ständig folgende Fehlermeldungen:
    Code:
     ./rmOldData
    rm /root/g8ser010_delete/datei_060627_0400.dmp
    ./rmOldData: line 57: ((: 060628: value too great for base (error token is "060628")
    ./rmOldData: line 57: ((: 060629: value too great for base (error token is "060629")
    rm /root/g8ser010_delete/datei_060630_0400.dmp
    rm /root/g8ser010_delete/datei_060701_0400.dmp
    rm /root/g8ser010_delete/datei_060702_0400.dmp
    rm /root/g8ser010_delete/datei_060703_0400.dmp
    rm /root/g8ser010_delete/datei_060704_0400.dmp
    Die Dateien sehen folgendermasen aus:
    Code:
    datei_060626_0400.dmp
    datei_060627_0400.dmp
    datei_060628_0400.dmp
    datei_060629_0400.dmp
    datei_060630_0400.dmp
    datei_060701_0400.dmp
    datei_060702_0400.dmp
    datei_060703_0400.dmp
    datei_060704_0400.dmp
    Das ist das Skript:
    Code:
    DateiAlter=10
    AktuellesDatum=`date +%y%m%d`
    Tag=`date --date -$DateiAlter\ days +%d`
    Monat=`date --date -$DateiAlter\ days +%m`
    Jahr=`date --date -$DateiAlter\ days +%y`
    DatumsGrenze=$Jahr$Monat$Tag
    Verzeichnis="/DUMPS/*dmp"
    
    #echo $DatumsGrenze
    #echo $AktuellesDatum
    
    for Datei in `ls $Verzeichnis`
     do
       DateiDatum=`echo $Datei | awk -F "_" '{print $4}'`
       if (( $DateiDatum > $DatumsGrenze ))
         then
          echo "rm $Datei"
       fi
     done
    Was mache ich Falsch?
    Geändert von mr_kaktus (07.07.06 um 14:11 Uhr)

  12. #12
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83
    Hi, also hab den Fehler gefunden.
    Wenn die Zahl mit einer "0" anfängt, dann wird das als Oktalzahl angesehen und deshalb kommt es zu Fehlern beim Vergleich.
    Hier ist das Fertig Skript:
    Code:
    ATEI_ALTER=5
    AKTUELLES_DATUM=`date +%y%m%d`
    TAG=`date --date -$DATEI_ALTER\ days +%d`
    MONAT=`date --date -$DATEI_ALTER\ days +%m`
    JAHR=`date --date -$DATEI_ALTER\ days +%y`
    DATUMS_GRENZE=$JAHR$MONAT$TAG
    DIR="/root/DUMPS/*.dmp"
    
    
    for DATEI in `ls $DIR`
     do
       DATEI_DATUM=`echo $DATEI | awk -F "_" '{print $3}'`
       if (( 10#$DATEI_DATUM <= 10#$DATUMS_GRENZE ))
         then
          echo "rm $DATEI"
       fi
     done
    Geändert von mr_kaktus (07.07.06 um 14:51 Uhr)

  13. #13
    Who's Johnny? Avatar von L00NIX
    Registriert seit
    Mar 2004
    Beiträge
    1.229
    Zitat Zitat von mr_kaktus
    Leider funkt das mit dem -ctime nicht?!
    Wenn ich -ctime weg lasse findet er alle Dateien.
    Wär schon cool, wenn es mit dem Find funktionieren würde.
    Nimm doch mtime (Datum der letzten Änderung):

    Code:
    $ find . -type f -mtime +10 -exec rm -f {} \;
             ^^^^^^^ nur Dateien
                     ^^^^^^^^^^ letzte Änderung vor mind. zehn Tagen
                                ^^^^^^^^^^^^^^ löschen ohne Nachfrage
    Und für weitere Optionen ruhig auch mal die Manpage zu find lesen und ein wenig mit den Optionen rumspielen.

    Gruß
    L00NIX

  14. #14
    Registrierter Benutzer
    Registriert seit
    Feb 2006
    Beiträge
    83
    Danke L00NIX, schaue ich mir gleich an.

Ähnliche Themen

  1. DOS-schreibgeschütze Dateien lassen sich nicht löschen
    Von T. Willert im Forum Linux in heterogenen Netzen
    Antworten: 5
    Letzter Beitrag: 30.04.06, 11:55
  2. Liste von Dateien löschen
    Von neptunus im Forum Linux Allgemein
    Antworten: 6
    Letzter Beitrag: 15.04.06, 22:52
  3. Per Cronjob alte dateien löschen.....
    Von rain im Forum Linux als Server
    Antworten: 3
    Letzter Beitrag: 03.02.06, 10:44
  4. Dateien in einem Verzeichnis nach einer Zeit löschen
    Von brauni im Forum Linux Allgemein
    Antworten: 10
    Letzter Beitrag: 03.11.05, 21:58
  5. Skript, um Dateien je nach Alter zu löschen
    Von Larsen im Forum Linux Allgemein
    Antworten: 1
    Letzter Beitrag: 06.10.04, 18:02

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •