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

S

Siegfried29

Jungspund
Hallo,nach Stundenlanger Suche mit meinem Freund Google versuch ich es jetzt mal hier....

Folgendes vorhaben.

Ich brauche ein Script was mir in einem "Verzeichniss" alle Verzeichnisse löscht die ein bestimmtes Alter überschritten haben.

Die möglichkeit Dateien zu löschen die älter als x Tage sind habe ich bereits gefunden.

Nochmals zu Erklärung

Beispiel

/srv/www/htdocs/ipc/pics <----- Verzeichniss

Darin befinden sich etliche Verzeichnisse ohne erkennbares Benennungsmuster

Ich möchte also das alle Verzeichnisse unter /srv/www/htdocs/ipc/pics gelöscht werden die älter als 14 Tage sind.


Wie und womit wäre das möglich. Am liebsten wäre mir natürlich ein Shellsript was ich per cron ausführen lassen kann.

Mein System

OS = Suse Linux 10.1 32 Bit
Shell = Bash


Bedanke mich jetzt schon mal für eure Hilfe und bin auf eure Ideen gespannt....


Viele Grüße Siegfried
 
Zuletzt bearbeitet:
Hi,

Wie und womit wäre das möglich. Am liebsten wäre mir natürlich ein Shellsript was ich per cron ausführen lassen kann.

das hast du doch schon ganz richtig erkannt, sollte sich mit einem Shellskript doch ziemlich schnell und einfach machen lassen.

Schau dir mal die manpage von find an, zusammen mit rm hast du dann doch schon alles was du brauchst, wenn ich mich nicht irre ;)

IMHO liegt das hier uebrigens im falschen Forum.

mfg,
bytepool
 
Zuletzt bearbeitet:
Ich bin mal ehrlich,was rede ich,bin immer ehrlich.....

Ich erhoffe mir das mir hier jemand das ding schreibt.....

Ich weiß,es ist nur nen Einzeiler warscheinlich,aber genau den brauch ich :)

Hab zu viel Respekt vorm bösen RM :) Also das ich da selbst rum probiere.....

Wäre also sehr dankbar wenn es mir einer ab nimmt,des weiteren iss mein Englisch irgend wie meinem alter entsprechend nicht mehr sehr frisch....


Des weiteren,im falschen Forum geschrieben? Sorry,muss das wohl einer verschieben :) Habt Geduld mit mir,ich steig hier noch durch :)
 
Verschoben.

Bitte noch OS und die verwendete Shell angeben.
 
Hi,

na gut, aber nur weil ich schon lange kein bash skript mehr geschrieben hab, und ich da grad mal wieder Spass dran hatte ;)
Im allgemeinen lohnt es sich echt die Grundlagen vom skripting zu lernen, das macht Spass und ist nuetzlich.

Code:
#!/bin/bash

path="/pfad/zu/verzeichnis/"

for dir in $(find $path -atime +14 -type d); do
    rm -rfv $dir;
done

Das ist jetzt ungetestet, sollte aber eigentlich gehen. Aber rm -rf ist natuerlich boese, da musst du gut mit aufpassen.
Du solltest das auf jeden Fall erst in einem Test Verzeichnis testen.

Edit:
Achso, wenn du das als cronjob haben willst, willst du wohl nicht die verbose Option, also nur rm -rf.

Edit2:
Eventuell hat das Skript Probleme mit Verzeichnisnamen die Leerzeichen enthalten. Aber Leerzeichen in Dateinamen gehoeren sich ja auch nicht ;)

mfg,
bytepool
 
Zuletzt bearbeitet:
Also,leider noch kein Erfolg.... hab nen Testverzeichniss mit Verzeichnissen älter als 14 tagen,es wird nichts gelöscht.....

pack ich deine idee in ne einfache datei,sprich autodelete oder in ne autodelete.sh

ausführbar ist sie jedenfalls,habe mal beide varianten angelegt,aber es bringen beide keinen erfolg. es wird kein verzeichniss gelöscht....

selbstredend als root ausgeführt....
 
hab nen Testverzeichniss mit Verzeichnissen älter als 14 tagen,es wird nichts gelöscht.....

Oh, ehm, definiere doch bitte mal aelter...
-atime steht fuer access time, also Zugriffszeit, d.h. es wird abgefragt, ob auf die Datei in den letzten 14 Tagen zugegriffen wurde.

Edit:
Eventuell ist -ctime das was du suchst. Das gibt die letzte Statusaenderung der Datei.

mfg,
bytepool
 
Zuletzt bearbeitet:
Also ich meine definitiv Verzeichnisse die Älter als 14 Tage alt sind.... sprich vor 15 Tagen und mehr angelegt wurden....

glaube ich muss auch erwähnen das sich in den Verzeichnissen Dateien befinden oder?

Also nochmal zusammen gefasst,ich möchte das er Verzeichnisse in einem Verzeichniss löscht,er soll schauen was älter als 14 tage alt ist und es löschen,dabei zu beachten,die verzeichnisse die er löschen soll sind nicht leer,darin befinden sich ab und zu auch verzeichnisse und IMMER dateien....

So,nu haben wir es :)

///edit Musste gerade leider woanders lesen das rmdir NIEMALS Verzeichnisse löscht in denen sich noch dateien befinden.... Was machen wa denn nun? Doch immer von Hand alte Verzeichnisse samt inhalt löschen???
 
Zuletzt bearbeitet:
Hi,

also sonst koennte ich nur noch -mtime anbieten, das ist die modification time, also die Zeit zu der die Datei als letztes geaendert wurde ;)
Wie man an die Zeit der Erstellung rankommt weiss ich gar nicht.

Ausserdem fiel mir grade ein, dass find standardmaessig rekursiv arbeitet, d.h. du solltest auch noch -maxdepth 1 setzen, damit er nur die Verzeichnisse im uebergebenen Verzeichnis findet. Den Rest erledigt dann rm.

Edit:
Also das sollte dann in etwa so aussehen:
Code:
for dir in $(find $path -maxdepth 1 -mtime +14 -type d); do
    rm -rf $dir;
done

mfg,
bytepool
 
Code:
#!/bin/bash

path="/home/test/müll/"

for dir in $(find $path -maxdepth 1 -mtime +2 -type d); do
    rm -rfv $dir;
done


In /home/test/müll/ befinden sich etliche ordner mit dateien darin,einige ordner von heute,einige älter,maximal 5 tage alt,habe deswegen mal testweise deinen code auf -mtime +2 gesetzt.....

Und trotzdem passiert nichts....

meine Datei heisst autodelete.sh ausführen tu ich sie als root

testserver:~ # ./autodelete.sh
testserver:~ # autodelete.sh

Beide Varianten bringen weder nen Fehler,noch nen Erfolg....

doch ne schwere Geburt oder.... :)
 
Hast du mal geguckt was dir einfach nur "find ./ -maxdepth 1 -mtime +2 -type d" in dem Verzeichnis ausgibt?

Im uebrigen scheint find auch das aktuelle Verzeichnis (./) mit auszugeben, was natuerlich nicht das ist was du willst, denn wenn das als Argument an rm -rf uebergeben wird, wuerde er das root Verzeichnis (von dem Aufruf) direkt mit Loeschen. Muesste man wohl auch noch mit rausnehmen, kA ob find dafuer eine option hat, oder ob man das mit einer if Abfrage machen muesste.

mfg,
bytepool
 
find ./ -maxdepth 1 -mtime +2 -type d

nach diesem Befehl zeigt er mir 5 Ordner an,13 befinden sich im Ordner,also scheint er ja schon mal die zu finden die älter als 2 tage sind.... nur das löschen scheint ihm nen problem zu machen.....

Folgende Ausgabe

Code:
testserver:/home/test/müll # find ./ -maxdepth 1 -mtime +2 -type d
./BilderMesse 28032008
./BilderMesse 26032008
./BilderMesse 25032008
./BilderMesse 22032008
./BilderMesse 11032008
testserver:/home/test/müll #



Aufpassen,habe jetzt mal in deinen code das rm -rfv durch rm -rfiv ersetzt.....

Schau dir mal die meldung an,evtl kannst damit was anfangen.....


Code:
testserver:~ # autodelete.sh                                                                     
rm: cannot lstat `/home/test/müll/BilderMesse 28032008': No such file or directory
rm: cannot lstat `BilderMesse 26032008': No such file or directory
rm: cannot lstat `BilderMesse 25032008': No such file or directory
rm: cannot lstat `BilderMesse 22032008': No such file or directory
rm: cannot lstat `/home/test/müll/BilderMesse 11032008': No such file or directory
testserver:~ #

Das ist doch komisch oder?
 
Zuletzt bearbeitet:
///edit Musste gerade leider woanders lesen das rmdir NIEMALS Verzeichnisse löscht in denen sich noch dateien befinden.... Was machen wa denn nun? Doch immer von Hand alte Verzeichnisse samt inhalt löschen???

Wer schrieb denn auch was von rmdir? Ich schrieb "rm -rf", das ist ein voellig anderer Befehl.

Und sehe ich da etwa Leerzeichen in den Verzeichnisnamen? Siehe einen meiner Edits von weiter oben ;)
Das Skript kann in der jetztigen Form damit nicht umgehen. Laut manpage laesst sich das Problem mit einem bestimmten Parameter umgehen, aber ich habe noch nicht wirklich rausgefunden wie das funktionieren soll. Da muessten wohl die find Spezialisten hier ran ;)

mfg,
bytepool
 
Zuletzt bearbeitet:
Ich würde das ja mittels "-exec" machen.

Na nu aber,dann hau mal einen rein,selbst wenn ich in den ordner einen ordner rein packe der keine leerzeichen enthält klappt das nicht,wobei ja das änderungsdatum wieder nicht stimmt wa....

Also Rain_Maker,wäre natürlich an allem brauchbaren interessiert....

vielleicht nen perl script :) keine ahnung,hab jedenfalls wirklich keine lust mehr alle 14 tage da von hand zu löschen,sind nämlich unmengen von ordnern die da zusammen kommen....... leider.....
 
Na nu aber,dann hau mal einen rein,

Tut mir leid, aber ich bin nicht Dein persönlicher Depp vom Dienst, da musst Du auf jemand anderes warten, der Dir die fertige Lösung ins Popöchen bläst.

Mit einem herzlichen

Code:
man find
verabschiede ich mich wieder.

P.S. Und zum Thema "Blind Befehle als root abptippen" findet sich links unten unter "ähnliche Themen" was richtig Nettes.

http://www.unixboard.de/vb3/showthread.php?t=19829

Und darin dieser geniale Link:

http://www.unixboard.de/vb3/showthread.php?t=19793
 
Zuletzt bearbeitet von einem Moderator:
War eigentlich nicht böse gemeint,denke da ist mein Berliner humor nur ein wenig falsch verstanden worden....

Denke aber nicht das ich hier sitz und auf passende antworten warte.... auch ich versuche mich in den weiten des inet schlau zu machen und das auch in diesem moment.....

Hoffe ja nur das mir jemand unter die arme greift,in Arsch blasen soll mir keiner was,das sei mal gesagt....

Hoffe dies macht dir meine Situation ein wenig verständlicher...... Danke.....


Beide Threads bereits gelesen und das trotz heutiger Anmeldung..... Blind macht hier auch keiner was,keine Angst....
 
Zuletzt bearbeitet:
Tut mir leid, aber ich bin nicht Dein persönlicher Depp vom Dienst

Hehe, ne, den Spiel ich heute, aber auch nur weils mich selber interessiert.

Code:
find $path -maxdepth 1 -mtime +14 -type d -exec rm -rf {} ';'
Wenn ich mich jetzt nicht voellig irre ;)

Aber jetzt bin ich auch weg, muss in 6 Stunden zur Arbeit...

mfg,
bytepool
 
War eigentlich nicht böse gemeint,denke da ist mein Berliner humor nur ein wenig falsch verstanden worden....

Mag sein,

Ich bin mal ehrlich,was rede ich,bin immer ehrlich.....

Ich erhoffe mir das mir hier jemand das ding schreibt.....

Ich weiß,es ist nur nen Einzeiler warscheinlich,aber genau den brauch ich

aber mein "nicht Berliner Humor" sagt Dir:

"Ich bin mal ehrlich, ganz ehrlich.

Mit der letzten Zeile hast Du sogar recht" :devil:

So, nun haben wir beide unser Spässchen gemacht.
 

Ähnliche Themen

script per Cronjob ausführen

Zurück
Oben