Gezieltes löschen von Dateien


Hawky

Mitglied
Hi,

Ich bin net so der Linux Profi, daher hab ich eine Frage.

Ich möchte ein Eintrag in der Crontabelle erstellen, der alle 5min ein bestimmtes Verzeichnis überprüft, in welches Bilder abgeleg werden. Er soll nun sobald ein neues bild ankommt das älteste löschen, nur weiß ich net wie ich nach diesen Dateien such (älteste,neuste). Wäre nett, wenn einer von euch mir helfen kann.

Danke
Hawky
 

RedWing

Erfahrenes Mitglied
Hi,
bastle dir ein Shell Skript was dann alle 5 min von deinem Cronjob ausgeführt wird.

In dem Skript sollte ungefähr folgendes drin stehen:

Code:
OLDEST=`ls -t -a | tail -1`  
rm $OLDEST
alle Datein im aktuellen Verz nach dem Zeitstempel geordnet und davon die letzte Zeile,
sprich die älteste Datei, das Ergebniss wird in ne Shell Var geschrieben und der Inhalt deren
dann gelöscht...

oder gleich:
Code:
rm `ls -t -a | tail -1`

Gruß

RedWing
 
Zuletzt bearbeitet:

Hawky

Mitglied
Hey cool DANKE morgen mal ausprobieren, wenns funktioniert meld ich mich nochmal (natürlich auch wenns nicht geht.)
 

Hawky

Mitglied
Naja...gehen tuts schon aber evtl. doch nicht so ganz wie ich es gerne hätte ;)

Ich erklär mein Problem nochmal evtl. wirds dann deutlicher:

Ich hab folgende Ordnerstruktur:

Ordner1
-----------2004
------------------Oktober
---------------------------- 07
-----------------------------08

Und jeden Tag um 0uhr wird eine neuer Ordner angelegt, morgen wäre es dann "09" ->

Ordner1
----------- 2004
-------------------Oktober
-------------------------------07
-------------------------------08
-------------------------------09

Jetz möchte ich aber das er "07" löscht, sobald der Ordner "09" erstellt wird. (das überprüft er meinetwegen nachts um 2)
Als erstes musser ja den Ordner 07 rekursiv löschen weil Dateien enthalten sind, das ist mir bewusst!

Ein weiteres Problem ist, dann wenn ein neuer Monat (November) beginnt, dann hab ich noch den Ordner vom Oktober der ja auch noch da ist...

Ich bin etwas verzweifelt ^^
 
Zuletzt bearbeitet:

imweasel

Erfahrenes Mitglied
Hi,

also das kpl. Script schreibe ich dir nicht... aber folgendes kannst du z.B. nutzen und um den alten Monat zu löschen:

Code:
#!/bin/sh
VERZ="Ordner1/"
alterMONAT=`date -d '1 month ago' +%B`
for X in `ls -lR $VERZ`
do
	if [ $X == $alterMONAT ]
	then
		# alten monat gefunden, also loeschen
		echo "$X kann man loeschen"
	fi
done

Aber du solltest beachten, das Linux zwar mit date -d '1 month ago' (oder auch '1 day ago') zurecht kommt, aber z.B. AIX nicht!
 

Hawky

Mitglied
Also so wies aussieht scheint es nicht zu funktionieren :(

Ich mag zu blöd dazu sein, aber ich muss es halt machen

Code:
#!/bin/sh
VERZ="ftmp/Bahnhof2/2004/"
alterMONAT=`date -d '1 month ago' +%B`
for X in `ls -lR $VERZ`
do
	if [ $X == $alterMONAT ]
	then
		#rm -R $X
		touch $X.txt
	fi
done

: bad interpreter: No such file or directoryn/sh

Das kommt als Fehler
 

imweasel

Erfahrenes Mitglied
Hawky hat gesagt.:
: bad interpreter: No such file or directoryn/sh

Das kommt als Fehler

Hi,

dann liegt deine Shell eben nicht unter /bin/sh! Finde den Pfad zu deiner Shell (z.B. mit which sh) und ändere die erste Zeile passend ab (z.B. #!/usr/bin/sh o.ä.), dann ist der Fehler weg.
 

Hawky

Mitglied
Hab ich eben auch gemerkt :) ging erst nachdem ich '#' weggemacht habe

naja trotzdem bringter nochn fehler

: No such file or directory !/bin/sh
'/clean_up_month_2: line 5: syntax error near unexpected token `do
'/clean_up_month_2: line 5: `do


obwohl meine Shell unter /bin/sh lliegt
 

imweasel

Erfahrenes Mitglied
Hi,

abgesehen davon, das die erste Zeile ein # enthalten sollte (s.a. Wikipedia) solltest du darauf achten Backticks ` ` zu setzten und nicht Singlequotes ' ' bei
Code:
for X in `ls -lR $VERZ`
Dann sollte es gehen.
 

Hawky

Mitglied
Code:
#!/bin/sh
VERZ="ftmp/Bahnhof2/2004/"
alterMONAT=`date -d '1 month ago' +%B`
for X in `ls -lR $VERZ`
do
	if [ $X == $alterMONAT ]
	then
		#rm -R $X
		#touch $X.txt
		# alten monat gefunden, also loeschen
		echo "$X kann man loeschen"
	fi
done

Das sind Backticks und keine Singlequotes
das # is auch drin.

Fehler:
: bad interpreter: No such file or directory

also irgendwas is da net ganz ok?!

SH:
/home/script# which sh
/bin/sh
 

Hawky

Mitglied
lag am editor unter vi hat man gesehen das da zeichen drinne waren die da nix zu suchen hatten und jetzt gehts, bringt zwar noch nicht das was ich will, aber es geht zumindestens mal
 

Hawky

Mitglied
#!/bin/sh
VERZ="ftmp/Bahnhof1/2004/"
aktuellerMonat=`date -d '1 days ago' +%B`
for Z in `ls -lR $VERZ`
do
if [ $Z == $aktuellerMonat ]
then
$aktuellerMonat == $aktuell
fi
done

VERZ_2="ftmp/Bahnhof1/2004/$aktuell/"
alterTAG = `date -d '2 days ago' +%B`
for Y in `ls -lR $VERZ_2`
do
if [ $Y == alterTAG ]
then
#rm -R $Y
touch $Y.txt
fi
done

Hier hab ich versucht zwei dinge zu verbinden, allerdings bin ich mir nicht ganz sich er was
das angeht. Ich vermute mal das funktioniert nicht so wie ich mir das denke! Ich brauch halt bei der Pfadangabe ne variable, weil die ordner sich ändern, weil immer neue hnzukommen und die alten gelöscht werden sollen. wäre nett wenn ich da auch noch ne Hilfestellung bekomme!
 

imweasel

Erfahrenes Mitglied
Hi,

also wenn das bei dir mit der Schleife nicht hinhaut gibt es noch eine Alternative
Code:
#!/bin/sh

# Ordner zum durchsuchen bestimmen
ORDNER="Ordner1/"
# vergangenen Monat bestimmen
ALTERMONAT=`date -d '1 month ago' +%B`
# Order nach altem Monat durchsuchen und ggf. loeschen
rmMONAT=`find $ORDNER -name $ALTERMONAT -type d`
rm -rf $rmMONAT
# den Ordner von Vorgestern finden und ggf loeschen
VORGESTERN=`date -d '2 days ago' +%d`
rmTAG=`find $ORDNER -name $VORGESTERN -type d`
rm $rmTAG

Das Scripte solltest du dann noch mit
Code:
chmod a+x SCRIPTNAME
ausführbar machen.

Pack das ganze in einen Cron und lasse es z.B. um 00:05Uhr laufen. Dann wird wird (wenn vorhanden) der Ordner aus dem Vormonat und der Ordner von Vorgestern (wenn vorhanden) rekursiv gelöscht.
 

Neue Beiträge

Forum-Statistiken

Themen
272.360
Beiträge
1.558.626
Mitglieder
187.833
Neuestes Mitglied
SirrDansen