• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[SOLVED] Dateien Löschen die älter als 10 Tage sind

mr_kaktus

Member
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?
 
A

Anonymous

Gast
mr_kaktus schrieb:
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
Wenn es nur mal sein kann das Dateien mal geändert werden, und nicht der Regelfall, ist dann würde ich doch mtime verwenden. Wenn die Datei mal geändert wurde dann wird sie eben erst 10 Tage nach der Änderung gelöscht. Alles andere wird etwas komplizierter. Du könntest etwas so vorgehen, einen einfacheren Weg sehe ich im Moment nicht.
Code:
heute  =  6*365 +31+28+31+30+31+30+7 
Datei_060609 =  6*365 +31+28+31+30+31+9  

wenn Datei_060609 < (heute - 10) dann löschen
da du von jeder Datei den Tag ausrechnen musst, lohnt sich der Aufwand wohl kaum, und da sind jetzt noch nichtmal die Schaltjahre beachtet. Selbst wenn du ein Datumsfunktion nehmen würdest, Stunden Minuten und Sekunden auf Null setzt und dann aus dem Tag der Datei die Zeit in Sekunden seit 1.1.1970 umrechnest und dann ausrechnest wieviele Sekunden 10 Tage haben und dann den Vergleich und die Löschung vornimmst. Der Aufwand bleibt ziemlich gleich.

Eine etwas einfachere Möglichkeit besteht eventuell noch, indem du jeden Tag per Cron eine Datei erstellen lässt, die den selben Datumstring beinhaltet, dann kannst du diese Dateien dann als Reverenzdateien nehmen, also nur wenn die Dateien mit eine der letzen 10 Reverenzdateien zusammenpassen, dann aufheben, sonst löschen. (Halte ich aber für sehr kritisch, wenn dein Rechner mal ausfallen sollte oder aus irgend einem Grund mal keine Reverenzdatei erstellt wird, dann werden Dateien von diesem Tag zu früh gelöscht.)


robi
 
OP
M

mr_kaktus

Member
HI,

hab eine Lösung gefunden, nur klappt das mit dem Vergleichen nicht.
Ich poste mal alles.
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

Das sind die Datei im Verzeichnis DUMPS:
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

Wenn ich das Skript Ausführe, dann bekomme ich folgende Fehlermeldung:
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

Was mache ich falsch?[/code]
 
Also das Vergleichen, könnte so funktionieren:
Code:
...
DIR="/DUMPS/"
find -H $DIR -name "*.dmp" -print | while read i; do
  if [ `basename $i .dmp | awk -F_ '{print $2}'`>$DatumsGrenze ];
   then echo "rm $i";
  fi;
done;
 

abgdf

Guru
Hallo mr_kaktus,

neulich habe ich ein Python-Skript geschrieben, das mir Wochentag und Datum von morgen (also "heute +1") ausgibt (um es an eine Datei zu hängen) (Schaltjahr fehlt noch):

Code:
#!/usr/bin/env python
# -*- coding: utf8 -*-
from time import localtime
wota=["Montag","Dienstag","Mittwoch","Donnerstag", "Freitag", "Sonnabend", "Sonntag"]
tm=localtime()
t=tm[2]
m=tm[1]
j=tm[0]
wotanz=tm[6]
t += 1
wotanz += 1
if wotanz == 7:
  wotanz = 0
x=[4,6,9,11]
x2=[1,3,5,7,8,10]
for i in range(len(x)):
  if t == 31 and m==x[i]:
    m += 1
    t = 1
for i in range(len(x2)):
  if t == 32 and m==x2[i]:
    m += 1
    t = 1
if t == 32 and m==12:
  j += 1
  m = 1
  t = 1
if t == 29 and m==2:
  m += 1
  t = 1
datstr=wota[wotanz]+", "
if t < 10:
  datstr += "0"
datstr += str(t)+"."
if m < 10:
  datstr += "0"
datstr += str(m)+"."+str(j)
print datstr

Für "heute +10" bräuchte es aber noch ein paar Änderungen. Vielleicht hilft das ein bißchen (könnte man ja prinzipiell auch nach bash übertragen).

Aber ihr scheint das ja bald auch so schon hinzukriegen ...

Viele Grüße
 

abgdf

Guru
Hurra,

jetzt hab ich's mit Python hinbekommen:

Code:
#!/usr/bin/env python
# -*- coding: utf8 -*-

import time
import os

dir="/DUMPS"
ls=[]
lscur=os.listdir(dir)
for i in lscur:
  if i[-3:]=="dmp":
    ls.append(i)
del(lscur)
tm=time.time()
diff=10*24*60*60

for i in ls:
  a=i.split("_")[1]
  ttup=time.strptime(a,"%y%m%d")
  ftime=time.mktime(ttup)
  if tm-ftime > diff:
    print "rm "+dir+"/"+i
    # Uncomment to execute deletion:
    # os.remove(dir+"/"+i)

Ggf. Verzeichnisname (Variable "dir". default: "/DUMPS") ändern.
Dateien müssen wirklich im Format z.B. "datei_060627_0400.dmp" sein, insbesondere muß das Datum in dem Format "Jahr, Monat, Tag" (jeweils 2stellig) im Dateinamen zwischen dem ersten und zweiten "_" stehen.

--------------------------------------------------
Ich erläutere noch, was ich gemacht habe:

Der Inhalt des Verzeichnisses wird ausgelesen (wie ls), die Dateinamen, die auf "dmp" enden, werden in die Listen-Variable "ls" geschrieben.

Die Variable "ls" wird durchgegangen. Die Datumswerte in den Dateinamen werden jeweils in die Variable "a" als String übertragen.
Die Funktion "time.strptime()" aus dem Python-Modul "time" erzeugt aus einem String wie dem in der Variablen "a" eine (unveränderbare) Liste (Tupel) mit Zeitangaben in einem bestimmten Format, wie in "pydoc time" angegeben.
Aus diesem Tupel ("ttup") wird dann mit der Funktion "time.mktime()" die Zeit in Sekunden ab einem absoluten Nullpunkt (1.1.1970) erzeugt und in der Variable "ftime" gespeichert.
Es handelt sich dabei also um die Zeit, die sich jeweils aus dem Datum in dem Dateinamen ergibt.

Die Variable "tm" enthält den gegenwärtigen Zeitwert in Sekunden (Funktion "time.time()"), die Variable "diff" die Anzahl der Sekunden von 10 Tagen.
Wenn "tm" minus "ftime" größer als "diff" ist, ist die jeweilige Datei demnach älter als zehn Tage.

Das funktioniert, weil das Python-Modul "time" sehr leistungsstarke Funktionen zur Verarbeitung von Zeit- und Datumswerten zur Verfügung stellt.
--------------------------------------------------

Viele Grüße
 
OP
M

mr_kaktus

Member
Mal ne ganz Dumme Frage, wieso klappt diese IF-Abfrage nicht?!

Code:
#!/bin/bash



if (( 060629 >= 060706 ))
  then
  echo "Juenger"
else
  echo "Aelter"
fi
Ich bekomme folgende Meldung:
Code:
./a: line 5: ((: 060629: value too great for base (error token is "060629")
Aelter
Also er Führt das schon aus, er sagt ja Aelter, aber warum kommt diese Meldung?

Komisch finde ich, dass es aber so Funktioniert :?:
Code:
if (( 060630 >= 060706 ))
  then
  echo "Juenger"
else
  echo "Aelter"
fi
 
A

Anonymous

Gast
nimm test zu hilfe, dann bist du auf der sicheren Seite

Code:
if [ 060629 -gt 060706 ]

so wie du das geschreiben hast, nimmt er das als Oktalzahlen und da stört ihn dann eine 8 oder 9 irgendwo und die meckert er dann an.
man bash sagt
Constants with a leading 0 are interpreted as octal numbers

robi
 
OP
M

mr_kaktus

Member
Wollte gerade Posten hab den Fehler auch gefunden ... das ist ja mal ein scheiß ... :lol:

Also hab hier das Skript jetzt fertig Geschrieben und es funktioniert auch:
Code:
DATEI_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
 

abgdf

Guru
Gückwunsch !

Wußte gar nicht, daß sowas wie
Code:
date --date '10 days'
geht :idea:.
Die Unix-Tools können eben mehr als man denkt ...

Viele Grüße
 
Oben