Linux: Skript zum automatischen löschen der ältesten X Prozent, falls Ordner größer als Y?
Hallo, ich bin auf der Suche nach einem Skript für meinen Raspberry Pi. Das Skript soll die ältesten X Prozent der Dateien in einem Ordner löschen, falls die Dateien im Ordner größer als Y GB sind. Gedacht ist das ganze für eine Überwachungskamera, die die Dateien so lange wie möglich behalten soll (sonst könnte ich ja einfach "Lösche Dateien, die älter als Z Tage sind" machen).
Ich habe mal angefangen mit:
"Speicher_max=16
if [du -sh /verzeichnis -ge Speicher_max]"
Wie könnte es weiter gehen, oder hab ich da schon den ersten Fehler? Leider kenne ich mich mit Linux noch nicht aus bzw. versuche mich gerade etwas einzuarbeiten. Danke =)
2 Antworten
Mach ein C Programm, ist finde ich leichter als ein bash script, aber was bringt es dir wenn du einen haufen kleine alte Dateien hast weil die größeren immer gelöscht werden. Auch wenn du Dateien ziemlich lange beahlten wirst, du wirst mit diesem Ansatz irgendwann einen haufen kleiner Datein haben die du nicht mehr brauchst. Sag einfach lösche alle Datein die älter sind als 1 Woche, bzw mach nach einer Woche eine automatische kopie übers Netzwerk
Hallo
Das Skript soll die ältesten X Prozent der Dateien in einem Ordner löschen
Die älteste Datei findest Du zum Beispiel so:
(export LC_ALL=C
find . -type f -printf '%T@\t%p\0' 2>/dev/null |
sort -zg | tr '\0\n' '\n\0' | head -n 1 |
cut -f2- | tr '\0' '\n')
Ersetzt Du da das head -n 1 durch head -n 8 wären es eben die 8 ältesten Dateien. (ohne den Parameter -n wären es immer 10
Um Prozentual zu machen wäre eine Berechnung nötig, etwa mit dem basic calculator:
ANZAHL=$(ls -1c .| wc -l) # Errechnen der Menge an Dateien
bc -l <<< $ANZAHL/100*30 | cut -d'.' -f1
Hier würden also die menge von 30% aller Dateien des aktuellen Verzeichnisses ausgegeben werden.
falls die Dateien im Ordner größer als Y GB sind.
Die größten Dateien findet man beispielsweise damit:
find . -type f -size +1048576 -printf "%s:%h%f\n" 2>/dev/null | sort -nr | head
oder damit
ls -lsh | head -n 11 | tail | grep -v ^d | sed 's/^[ \t]*//;s/[ \t]*$//' | awk '{print $1,$10}'
Das Ganze nur noch sinnvoll miteinander verbinden, etwa mit einer if Anweisung
Gedacht ist das ganze für eine Überwachungskamera,
Dann schau Dir mal das Video an:
https://www.youtube.com/watch?v=XDZ187MpAho
Die 2> in den Code Tags sind eigentlich > Zeichen!Linuxhase