ubuntuusers.de

Ordner löschen, aber bestimmte Anzahl behalten

Status: Gelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

UBUNTUTUT

Avatar von UBUNTUTUT

Anmeldungsdatum:
12. Dezember 2017

Beiträge: 71

Hallo zusammen!

Ich habe einen Ordner CloneZilla in /media/Storage/ und darin vom selbigen Programm erzeugte (Unter-)Ordner

2021-01-27-18
2021-01-26-17
2021-01-24-17
2021-01-24-15
2021-01-21-23

Nun möchte ich gerne die Ordner (samt Inhalt) löschen, aber eine bestimmte Anzahl (drei Stück) auslassen/behalten.

Die ältesten Ordner (Images) sollen also gelöscht werden und die neuesten (drei Stück) sollen behalten werden.

Was mir auch etwas Kopfzerbrechen macht: Wie sollte das ganze funktionieren, wenn nur 3 oder 2 Ordner vorhanden sind?

laienhaft ausgedrückt: "WENN die Anzahl der Ordner kleiner/gleich 3, DANN mache nichts, SONST lösche alle alten bis auf die 3 neusten"

Kann mir dabei jemand helfen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11257

Wohnort: München

Da könnte man z.B. sowas machen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env python3
import pathlib
import shutil

BACKUP_DIR = pathlib.Path("/media/Storage/CloneZilla")

for d in sorted((p for p in BACKUP_DIR.iterdir() if p.is_dir()), reverse=True)[3:]:
    print(f"removing {d}")
    # die Raute vor der nachfolgenden Zeile entfernen, um das Verzeichnis inkl. Inhalt tatsächlich zu löschen
    #shutil.rmtree(d)

UBUNTUTUT

(Themenstarter)
Avatar von UBUNTUTUT

Anmeldungsdatum:
12. Dezember 2017

Beiträge: 71

Mist, jetzt hatte ich noch einen Haufen dazu-editiert, was ich mit

ls -td /media/Storage/CloneZilla/* | tail -n 3

versucht habe und nun kommt "Du kannst den Beitrag nicht editieren". ☹

seahawk1986, lieben Dank! Blöde Frage zum Abschluss, kann ich das einfach in meine "upload2NAS.sh" übernehmen?

#!/bin/bash
HOST='192.168.178.96'
USER='UBUNTUT'
PASS='*******'
TARGETFOLDER='/NAS/XUBUNTU CloneZilla Images ID90'
SOURCEFOLDER='/media/Storage/CloneZilla'

lftp -f "
open $HOST
user $USER $PASS
lcd $PCFOLDER
mirror --continue --reverse --use-cache --exclude-glob .* --exclude-glob .*/ --verbose '$SOURCEFOLDER' '$TARGETFOLDER'
bye
"

Ich frage weil da "#!/usr/bin/env python3" steht ...

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11257

Wohnort: München

Du kannst das mit einem Here Document im Skript unterbringen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
HOST='192.168.178.96'
USER='UBUNTUT'
PASS='*******'
TARGETFOLDER='/NAS/XUBUNTU CloneZilla Images ID90'
SOURCEFOLDER='/media/Storage/CloneZilla'

lftp -f "
open $HOST
user $USER $PASS
lcd $PCFOLDER
mirror --continue --reverse --use-cache --exclude-glob .* --exclude-glob .*/ --verbose '$SOURCEFOLDER' '$TARGETFOLDER'
bye
"

python3 << EOF
import pathlib
import shutil

BACKUP_DIR = pathlib.Path("$SOURCEFOLDER")

for d in sorted((p for p in BACKUP_DIR.iterdir() if p.is_dir()), reverse=True)[3:]:
    print(f"removing {d}")
    # die Raute vor der nachfolgenden Zeile entfernen, um das Verzeichnis inkl. Inhalt tatsächlich zu löschen
    #shutil.rmtree(d)
EOF

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# ins Arrray damit:
ordner=(/media/storag/2021*) 
# seid ihr alle da?
for o in ${ordner[@]}; do echo $o; done 
# Länge des Arrays
l=${#ordner[@]}
# Löschen bis auf 3:
for i in $(seq 0 $((l-4))); do echo rm ${ordner[i]}; done 
rm 2021-01-21-23
rm 2021-01-24-15

Das echo dient der Sicherheit, aber sollte gehen. Wenn ich alle bis auf die jüngsten 7 löschen will (statt 3), dann passiert auch nichts.

Python!

Update: (kleine Korrektur: seq von 0 statt 1 starten lassen, dafür bis l-4 statt l-3)

UBUNTUTUT

(Themenstarter)
Avatar von UBUNTUTUT

Anmeldungsdatum:
12. Dezember 2017

Beiträge: 71

@user_unknown: danke, das werde ich mir am Wochenende mal ansehen, was ich damit noch anstellen kann.

@seahawk1986: läuft ... like a charm! 😉👍 Vielen lieben Dank!

Schönes Wochenende!

Antworten |