Auslesen / durchsuchen / überprüfen / löschen

O

ofcourse

Grünschnabel
Für euch vermutlich eine Kleinigkeit, für mich ein grosses Stück Arbeit - als bekennender Newbie.

Mein Ziel, ein Befehl für die Bash, die zuerst auf meinem Server das /home Verzeichnis auslesen soll. (Hier befinden sich ca. 30 User Ordner).
Hier soll nun in jeden Ordner reingeschaut werden, ob es einen FTP-Ordner gibt.
Wenn JA, sollen in diesem Ordner alle Dateien gelöscht werden, die älter als 4 Wochen sind.

Ich hab mich nun schon durch das ein oder andere Tutorial gequält, aber die Erleuchtung will mir nicht recht kommen. :(
Lösungsvorschläge und auch persönliche Tutorial-Empfehlungen sind gern gesehen!

Thx,
ofcourse
 
Ungetestet:
Code:
#! /bin/bash

FTP_FOLDERS_LIST="/tmp/ftp-folders.tmp"
OLD_FILES_LST="/tmp/old-ftp-files.tmp"

find /home -iname ftp > $FTP_FOLDERS_LIST

while read FOLDER; do
	find "$FOLDER" -ctime 28 > $OLD_FILES_LIST
	while read FILE; do
		rm "$FILE"
	done < $OLD_FILES_LIST
done < $FTP_FOLDERS_LIST

rm $FTP_FOLDERS_LIST
rm $OLD_FILES_LIST
 
Vielen Dank!
Ich versuch das mal zu interpretieren, um eben nach und nach mal mehr hinter die Logik zu kommen - wenn ich darf?
Eine Korrektur der Interpretation wäre super!

Code:
FTP_FOLDERS_LIST="/tmp/ftp-folders.tmp"
OLD_FILES_LST="/tmp/old-ftp-files.tmp"

Hier verstehe ich, ich erstelle Variablen und gebe den Speicherort dafür an.

Code:
find /home -iname ftp > $FTP_FOLDERS_LIST

Er sucht im home Verzeichnis nach Ordnern die "ftp" im Namen haben und befüllt damit die Variable. (was bewirkt das -i ?)

Code:
while read FOLDER; do
	find "$FOLDER" -ctime 28 > $OLD_FILES_LIST
	while read FILE; do
		rm "$FILE"
	done < $OLD_FILES_LIST
done < $FTP_FOLDERS_LIST

Hier komm ich ein wenig ins Straucheln.
Solange er Ordner einliest, soll er die Variable Folder finden (?) und wenn die Zeit von 28 (woher weiß er das Tage gemeint sind?) rum sind, verschiebt er sie in die variable O_F_L ?

Bei dem Abschnitt stolpere ich doch noch ordentlich :(

Code:
rm $FTP_FOLDERS_LIST
rm $OLD_FILES_LIST

Löschen der erstellten Liste oder Variable.
 
Vielen Dank!
Ich versuch das mal zu interpretieren, um eben nach und nach mal mehr hinter die Logik zu kommen - wenn ich darf?
Eine Korrektur der Interpretation wäre super!

Code:
FTP_FOLDERS_LIST="/tmp/ftp-folders.tmp"
OLD_FILES_LST="/tmp/old-ftp-files.tmp"

Hier verstehe ich, ich erstelle Variablen und gebe den Speicherort dafür an.
Nicht ganz. Ich erstelle eine Variable mit dem Wert eines Dateinamens.
Wann immer ich die Variable später verwende, wird somit die Datei benutzt.

Code:
find /home -iname ftp > $FTP_FOLDERS_LIST

Er sucht im home Verzeichnis nach Ordnern die "ftp" im Namen haben und befüllt damit die Variable. (was bewirkt das -i ?)
Er sucht Einträge im Directory mit genau dem Namen "ftp" (case-insensitive) und schreibt das Ergebnis in den Wert der Variablen $FTP_FLODERS_LIST (hier /tmp/ftp-folders.tmp.
Code:
while read FOLDER; do
	find "$FOLDER" -ctime 28 > $OLD_FILES_LIST
	while read FILE; do
		rm "$FILE"
	done < $OLD_FILES_LIST
done < $FTP_FOLDERS_LIST

Hier komm ich ein wenig ins Straucheln.
Solange er Ordner einliest, soll er die Variable Folder finden (?) und wenn die Zeit von 28 (woher weiß er das Tage gemeint sind?) rum sind, verschiebt er sie in die variable O_F_L ?

Bei dem Abschnitt stolpere ich doch noch ordentlich :(
Die Schleife bekommt als Eingabe die gerade erstellte Datei. (die gefundenen Ordner namens ftp im $HOME.) Jeder Wert wird als $FOLDER weiterverarbeitet.
Dann werden mit der find-Anweisung Dateien gesucht, die älter als 28 tage sind.
Das ist im find-befehl so definiert. (siehe "man 1 find")
Jeder Treffer wird in eine weitere Datei geschrieben, wie auch schon beim ersten find-Befehl. Dannach kommt die nächste Schleife, die die zu löschen Dateien einliest und auch löscht.

Code:
rm $FTP_FOLDERS_LIST
rm $OLD_FILES_LIST

Löschen der erstellten Liste oder Variable.
Naja, eigentlich löschen der datei, aber da das script dann auch am Ende ist, sind die Variablen auch nicht mehr existent.

Ein Verbesserungvorschlag wäre in dem ersten find-befehl direkt nur auf directories zu prüfen und im zweiten Ausdruck den find-Befehl nur files suchen zu lassen und direkt zu löschen.
Das ist aber alles Geschmackssache, funktionieren sollte beides.
Code:
#! /bin/bash

FTP_FOLDERS_LIST="/tmp/ftp-folders.tmp"

find /home [b]-type d[/b] -iname ftp > $FTP_FOLDERS_LIST

while read FOLDER; do
	find "$FOLDER" [b]-type f[/b] -ctime 28 [b]-exec rm {} \;[/b]
	done < $FTP_FOLDERS_LIST

rm $FTP_FOLDERS_LIST

Vielleicht sollte man auch noch über eine "-maxdepth 2" nachdenken, um nicht zu tief in den $HOMES zu suchen und event. zu löschen.
 
Zuletzt bearbeitet:
Vielen, vielen Dank für die Hilfe & Erklärungen!
 
Oh, eine kurze Frage noch.... "-exec rm {} \" <--- rm = löschen, und der Rest?
 
Zurück
Oben