Schabi_Alex
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2017
Beiträge: 89
|
sebix schrieb: Willst du eigentlich, dass Ordner unterhalb von /home/samba-data/Aufzeichnungen/Cam_Eingang/ geloescht werden, wenn diese zu alt sind? Wenn ja, wie viele Ebenen?
Oder willst du alte Ordner unabhaengig von der Ebene finden und dann rekursiv loeschen?
Ja genau ich will ale Ordner unterhalb von /home/samba-data/Aufzeichnungen/Cam_Eingang/ löschen wenn diese leer sind bzw älter als 72 Stunden. Also das konkrete Problem:
Ich betreibe auf einem Gewerbegelände mehrere Überwachungskameras. Die Kameras speichern die Aufeichnungen via Samba Dienst auf meinem Server ab.
Dazu habe ich das Verzeichnis /home/samba-data/Aufzeichnungen/ geschaffen. Jede Kamera hat dort einen eigenen Ordner. So auch die "Cam_Eingang". Unter diesem Ordner wird automatisch der Ordner dav angelegt und in diesem wird jeden Tag ein Ordner mit dem Datum des Tages angelegt und in diesem Ordner wiederum jede Stunde ein Ordner welcher die Stunde der Aufzeichungn quasi wiederspiegelt. Sprich für die Aufzeichnugngen von 12:00:00 bis 12:59:59 wird ein Ordner angelegt der 12 heißt. Und in diesem Ordner werden je 10 Minuten ein Video der Kamera geseichert, auf welchem logischerweise dann immer 10 Minuten zu sehen sind. Nun habe ich das Problem, dass ich gesetzlich geshen diese Aufzeichnungen nur 72 Stunden speichern darf.
Das löschen der Videos nach 72 Stunden funktioniert ja mit
find /home/samba-data/Aufzeichnungen/Cam_Eingang/ -mtime +2 -delete
ganz gut, nur leider bleiben dann immer die leeren Ordner über weil die nicht gelöscht werden, da durch das löschen der Videos das Änderungsdatum des Ordners neu gesetzt wird und dieser danach dadurch nicht gelöscht wird.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Wenn du ein bekanntes Namensschema für die Ordner hast, kannst du auch anhand der Ordner-Namen bestimmen, ob die nicht mehr benötigt werden - wenn man z.B. Ordner nach dem Schema
YYY-mm-dd/hh hat, könnte man sowas machen:
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
27
28 | #!/usr/bin/env python3
from datetime import datetime, timedelta
from pathlib import Path
import shutil
import sys
if len(sys.argv) == 2:
BASEDIR = Path(sys.argv[1])
else:
sys.exit("usage: {} PATH".format(sys.argv[0]))
too_old = datetime.now() - timedelta(days=3)
day_dirs = set()
for d in BASEDIR.glob('*/*/'):
if not d.is_dir():
continue
try:
dir_date = datetime.strptime(str(d.relative_to(BASEDIR)), "%Y-%m-%d/%H")
except ValueError:
continue
if dir_date <= too_old:
shutil.rmtree(d)
day_dirs.add(d.parent)
for d in day_dirs:
try:
d.rmdir()
except IOError:
pass
|
Mit einem Testverzeichnisbaum, der 5 Tage zurückgeht:
for i in {0..5}; do mkdir -p "$(date -d "$i days ago" +%Y-%m-%d)"/{0..23}; done
bleibt dann in der Stunde vor 22 Uhr sowas übrig:
$ ./delete_old.py .
$ tree
.
├── 2018-08-07
│ ├── 22
│ └── 23
├── 2018-08-08
│ ├── 0
│ ├── 1
│ ├── 10
│ ├── 11
│ ├── 12
│ ├── 13
│ ├── 14
│ ├── 15
│ ├── 16
│ ├── 17
│ ├── 18
│ ├── 19
│ ├── 2
│ ├── 20
│ ├── 21
│ ├── 22
│ ├── 23
│ ├── 3
│ ├── 4
│ ├── 5
│ ├── 6
│ ├── 7
│ ├── 8
│ └── 9
├── 2018-08-09
│ ├── 0
│ ├── 1
│ ├── 10
│ ├── 11
│ ├── 12
│ ├── 13
│ ├── 14
│ ├── 15
│ ├── 16
│ ├── 17
│ ├── 18
│ ├── 19
│ ├── 2
│ ├── 20
│ ├── 21
│ ├── 22
│ ├── 23
│ ├── 3
│ ├── 4
│ ├── 5
│ ├── 6
│ ├── 7
│ ├── 8
│ └── 9
├── 2018-08-10
│ ├── 0
│ ├── 1
│ ├── 10
│ ├── 11
│ ├── 12
│ ├── 13
│ ├── 14
│ ├── 15
│ ├── 16
│ ├── 17
│ ├── 18
│ ├── 19
│ ├── 2
│ ├── 20
│ ├── 21
│ ├── 22
│ ├── 23
│ ├── 3
│ ├── 4
│ ├── 5
│ ├── 6
│ ├── 7
│ ├── 8
│ └── 9
└── delete_old.py
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Mit | find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -empty -delete
|
löschst Du Verzeichnisse (d) unterhalb von Cam_Eingang die leer sind. Mit einem zusätzlichen -mtime +1 vor dem -empty hängst Du zwar immer einen Tag hinterher, aber dafür kann nicht die Situation eintreten, dass gerade ein neues Verzeichnis für die folgenden Aufnahmen erzeugt wurde, in dem noch kein Video drin ist, und das gelöscht wird, so dass es später nicht gefunden wird, und Fehler passieren. seahawk1986 schrieb: Ansonsten könnte man auch im Nachgang nach dem Löschen der Dateien die leeren Verzeichnisse abräumen (je nach erreichter Verzeichnistiefe müsste man das ggf. mehrfach laufen):
find /home/samba-data/Aufzeichnungen/Cam_Eingang/ -empty -delete
Nein. Das -delete impliziert -depth, d.h. es wird von innen nach außen gelöscht und ein Durchlauf sollte genügen. Nur mit dem -mtime würde es sich beißen. Bei generischen Namen, die wohl immer gleich sind, und hoffentlich keine Leerstellen enthalten, könnte man aber auch pragmatisch so vorgehen: | for verzeichnis in $(find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -mtime +2 -empty)
do
rmdir "$verzeichnis"
done
|
|
BillMaier
Supporter
Anmeldungsdatum: 4. Dezember 2008
Beiträge: 6472
|
user_unknown schrieb: Bei generischen Namen, die wohl immer gleich sind, und hoffentlich keine Leerstellen enthalten, könnte man aber auch pragmatisch so vorgehen: | for verzeichnis in $(find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -mtime +2 -empty)
do
rmdir "$verzeichnis"
done
|
Darf ich mal blöd fragen, warum du das in eine for-Schleife packst und nicht ebenfalls an find übergibst? find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -mtime +2 -empty -delete oder auch find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -mtime +2 -empty -exec rmdir {} \; ?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
BillMaier schrieb: user_unknown schrieb: Bei generischen Namen, die wohl immer gleich sind, und hoffentlich keine Leerstellen enthalten, könnte man aber auch pragmatisch so vorgehen: | for verzeichnis in $(find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -mtime +2 -empty)
do
rmdir "$verzeichnis"
done
|
Darf ich mal blöd fragen, warum du das in eine for-Schleife packst und nicht ebenfalls an find übergibst? find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -mtime +2 -empty -delete
Das war ja, noch ohne Test auf -type d und mit der längeren Zeitspanne von +4 ungefähr meine erste Empfehlung (kein -empty-Test), allerdings ohne sie testen: | find home/samba-data/Aufzeichnungen/Cam_Eingang -mtime +4 -delete
|
zu der das Feedback war, dass ein Verzeichnis, nachdem etwas in ihm gelöscht wurde, eine neue mtime verpasst bekommt, und dann das übergeordnete Verzeichnis, selbst wenn es dann leer ist, nicht gelöscht wird. Allerdings ist pragmatisch betrachtet nach 20 Tagen dann doch 10 Ebenen tief gelöscht worden, es dauert dann eben etwas länger.
|
BillMaier
Supporter
Anmeldungsdatum: 4. Dezember 2008
Beiträge: 6472
|
|
Schabi_Alex
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2017
Beiträge: 89
|
Vorweg danke für die zahlreiche und auch hilfreichen Antworten! Ich würde es gerne damit lösen, dass ich zuerst die Videodateien lösche und danach einfach nach leeren Verzeichnissen suche und diese auch lösche:
#!/bin/bash
find /home/samba-data/Aufzeichnungen/ -mtime +2 -delete
find /home/samba-data/Aufzeichnungen/ -empty -delete Natürlich besteht nun die Möglichkeit einen Ordner zu löschen der gerade erst erstellt wurde um darin ein Video zu speichern. Jedoch werden alle Ordner immer nur zu jeder vollen Stunde angelegt und darin sofort ein Video abgelegt. Damit ich diesen Ordner nicht lösche, möchte ich eben den Cronjob 11 Minuten nach jeder vollen Stunde ausführen lassen. Darin liegt aber nun mein Problem. Das Skript funktioniert wenn ich es händisch ausführe wunderbar, doch mittels Cronjob passiert einfach gar nix.
Ich öffne normal crontab -e und hab dort folgendes hinterlegt:
11 * * * * /bin/bash/ /home/samba-data/Aufzeichnungen/skripte/autodelete.sh
Nur leider funktioniert das nicht.
Kann mir bitte jemand weiterhelfen und sagen wo der Fehler liegt? Danke schon vorab und lg
Alexander
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Schabi_Alex schrieb: Ich öffne normal crontab -e und hab dort folgendes hinterlegt:
11 * * * * /bin/bash/ /home/samba-data/Aufzeichnungen/skripte/autodelete.sh
Da ist dir ein Slash zu viel reingerutscht - /bin/bash ist ja eine ausführbare Datei und kein Ordner.
|
Schabi_Alex
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2017
Beiträge: 89
|
Oh klar, so ein offensichtlicher Fehler und ich suche studnenlang und finde ihn nicht ☹ Danke für deine Hilfe, jetzt funktioniert es! Lg
Alexander
|
BillMaier
Supporter
Anmeldungsdatum: 4. Dezember 2008
Beiträge: 6472
|
Schabi_Alex schrieb:
#!/bin/bash find /home/samba-data/Aufzeichnungen/ -mtime +2 -delete
find /home/samba-data/Aufzeichnungen/ -empty -delete
}}}
Nur noch ein Hinweis: In der zweiten Zeile fehlt da jetzt die Eingrenzung nach Ordnern. Es wird wohl eher selten sein, dass du da leere Dateien liegen hast, und vielleicht willst du die auch löschen - daher einfach nur der Hinweis hier. Gruß BillMaier
|
Schabi_Alex
(Themenstarter)
Anmeldungsdatum: 9. Oktober 2017
Beiträge: 89
|
BillMaier schrieb: Nur noch ein Hinweis: In der zweiten Zeile fehlt da jetzt die Eingrenzung nach Ordnern.
Danke erstmal für den Hinweis. Was genau meinst du? Bzw. wie kann ich das eingrenzen auf Ordner?
Meinst du das jetzt leere Ordner und leere Dateien gelöscht werden und man kann es esinschränken, dass nur leere Ordner gelöscht werden? lg
Alexander p.s. Es funktioniert derzeit wie gewünscht und es werden die leeren Ordner gelöscht, jedoch würde, wenn möglich, eine Einschränkung nur auf leere Ordner durchaus Sinn machen.
|
BillMaier
Supporter
Anmeldungsdatum: 4. Dezember 2008
Beiträge: 6472
|
korrekt. user_unknown schrieb: Mit | find /home/samba-data/Aufzeichnungen/Cam_Eingang -type d -empty -delete
|
löschst Du Verzeichnisse (d) unterhalb von Cam_Eingang die leer sind.
Gruß BillMaier
|