Automatisches Löschen des Samba-Papierkorbs auf einem FreeNAS/NAS4Free Server
Samba kann auf Netzwerkfreigaben einen Papierkorb, ähnlich dem Windows-Papierkorb, einrichten. Auch in FreeNAS und NAS4Free kann diese Funktion mittels Samba in der Web-Administration unter Dienste|CIFS/SMB|Freigaben aktiviert werden.
Dorthin werden alle gelöschten Dateien und Ordner einer Freigabe verschoben. Im Vergleich zum z.B. Windows-Papierkorb kann die maximale Größe nicht eingestellt werden, so dass im Laufe der Zeit die Größe deutlich zunimmt. Da alte Dateien nicht automatisch gelöscht werden, kann u.U. der Samba-Papierkorb die gesamte Freigabe belegen.
Um das zu verhindern, kann man mittels Cron-Job und einem kleinen Shell-Skript den Papierkorb regelmäßig und automatisch bereinigen.
Im Dateisystem von FreeNAS/NAS4free ist der Samba-Papierkorb im versteckten Ordner .recycle repräsentiert. Dort findet man alle gelöschten Dateien und Ordner einer Freigabe von allen Anwendern. Die nachfolgende Methode löscht Dateien und Ordner endgültig aus diesem Ordner, die vor einer anzugebenden Anzahl von Tagen dorthin verschoben (gelöscht) wurden.
-
Neue Datei, z.B.
delrecycle.sh
, erzeugen -
delrecycle.sh
mit folgendem Inhalt füllen:#!/bin/sh find /mnt/[Einhängepunkt]/.recycle/* -atime +[Alter] -exec rm -rf '{}' \; find /mnt/[Einhängepunkt]/.recycle/ -depth -type d -empty -exec rmdir {} \;
Passe
[Einhängepunkt]
und[Alter]
(Alter der Dateien im Papierkorb in Tagen, die gelöscht werden sollen) an.Update 12.07.2015: „gilada“ wies mich in einem Kommentar auf eine Fehlermeldung hin, die bei der Anwendung dieses Skripts auftrat:
find: missing argument to `-exec'
. Offensichtlich muss man bei aktuellen UNIX-Versionen das Semikolon (;) am Ende jeder Zeile mit eine Backslash (\) maskieren. Bei meiner alten FreeNAS-Version war das nicht nötig. Ich habe die Skripte entsprechend angepasst. Danke an „gilada“ für den Hinweis.Beispiel: Ist dein Einhängepunkt netzwerk und du willst, dass alle Dateien im Papierkorb gelöscht werden, die vor 90 Tagen oder vorher dorthin verschoben wurden, sieht das Skript
delrecycle.sh
wie folgt aus:#!/bin/sh find /mnt/netzwerk/.recycle/* -atime +90 -exec rm -rf '{}' \; find /mnt/netzwerk/.recycle/ -depth -type d -empty -exec rmdir {} \;
Bei mehreren Freigaben muss das obige Skript entsprechend erweitert werden: Heißt ein weiterer Einhängepunkt
network2
, sieht das Skript wie folgt aus:#!/bin/sh find /mnt/netzwerk/.recycle/* -atime +90 -exec rm -rf '{}' \; find /mnt/netzwerk/.recycle/ -depth -type d -empty -exec rmdir {} \; find /mnt/netzwerk2/.recycle/* -atime +90 -exec rm -rf '{}' \; find /mnt/netzwerk2/.recycle/ -depth -type d -empty -exec rmdir {} \;
- Das Skript
delrecycle.sh
auf eine Freigabe hochladen. - Cronjob unter System|Erweitert|Cron mit root-Rechten erstellen, der folgenden Befehl täglich ausführt:
sh /Pfad/zum/Einhängepunkt/delrecycle.sh
Nach dem obigen Beispiel lautet der Befehl:
sh /mnt/netzwerk/delrecycle.sh
Im Screenshoot wird der o.g. Befehl am ersten und fünfzehnten Tag jeden Monats um 0:00 Uhr ausgeführt.
Besonderheiten des Samba-Papierkorbs
Da der Samba-Papierkorb deutlich anders aufgebaut und zu benutzen ist, wie die Desktop-Papierkörbe von Windows, Mac OS X und Linux, kann der Artikel Besonderheiten des Samba-Papierkorbs weiterhelfen.
hallo, schöne erklärung!
bei mir geht es leider nicht, der cronjob wird nicht ausgeführt.pfad angaben sollten stimmen.
auch mit vollen rechten der datei eght es leider nicht.
system ist nas4free 9.1.0.1
ein kleiner tipp wäre spitze.
danke Michael
Hallo Michael,
was heißt „nicht ausgeführt“? Meinst du damit, dass keine Dateien gelöscht werden?
Dann ersetze „
-atime
“ durch „-mtime
“ im Skript „delrecycle.sh“.Hoffe das hilft. Wenn nicht, versuche mal das Skript manuell in der Shell zu starten, z.B. mit Putty (Windows) oder ssh (Linux/Mac OS X) oder direkt auf dem Server und schaue, ob es Fehlermeldungen ausgibt.
hallo, du bist spitze 🙂
es war kein fehler im script selbst, sondern einer von mir.
aber mit deiner antwort hast du mich so motiviert, das ich mir das ganze noch mal genau angeschaut habe und meinen eigenen fehler gefunden habe.
Ich hatte den namen von meiner freigabe eingegeben.
„sh /mnt/space/delrecycle.sh“
und nicht Name des Einhängepunkts, also so
„sh /mnt/Platte1/delrecycle.sh“
So es lauft nun perfekt, VIELEN DANK!
MfG Michael
ps: ich habe nichts gefunden, evtl. hast du ja auch schon mal einen schönen beitrag erstellt wie man NAS, mit einen cronjob, auf noch active clients prüft und bei nicht vorhanden sein herunterfäht?
Hi Andreas, schön das es jetzt bei dir klappt. Beim mir läuft das NAS 24/7, so dass ich mir noch keine Gedanken darüber gemacht habe, wie man es im Leerlauf abschaltet.
Schaue aber mal unter http://www.kadder.de/2012/08/freenas-automatisch-bei-nicht-benutzung-abschalten/, ob das bei dir klappt.
LG Hani
Hallo, das Script hatte ich getestet, es geht bei mir unter nas4free wie auch unter Linux mint nicht.
Es kommt immer der Fehler „…, in“
Ich habe mich dann selbst mal damit auseinander gesetzt und es umgeschrieben.
Jetzt geht’s und läuft wunderbar 🙂
Nochmal vielen dank für deine Unterstützung.
Grüße Michael
Hallo,
das Skript liefert bei mir den Fehler:
: unknown primary or operator
zurück
Es liegt an der zweiten Zeile:
find /mnt/netzwerk/.recycle/ -depth -type d -empty -exec rmdir {} \;
Wenn ich die Zeile direkt im Shell ausführe läuft sie fehlerfrei, wenn ich sie in eine .sh Datei ausgelagert aufrufe kommt der Fehler.
Ich setzte FreeNAS 8.3.0 ein.
Jemand eine Idee?
Grüße
Sorry Niels, ich kann den Fehler bei mir nicht nachvollziehen.
Hallo Hani,
danke für deine Mühe mir zu helfen. Habe noch mal auf deine Hinweise hin einige Tests gemacht:
– ja, die Fehlermeldung wird im Shell nach Eingabe von „sh delrecycle.sh“ angezeigt
– Ausführen der ersten Zeile in der Shell: läuft durch, Dateien werden gelöscht; zweite Zeile im Shell: geht auch (immer noch)
– ja, hab es gerade zum zehnten Mal neu eingetippt und in der Shell direkt läuft es ja
Ich versteh’s nicht
Ich kann mir zwar nicht vorstellen, das es an der neuen Shell liegt, die mit „sh“ gestartet wird, aber versuch einfach mal als „last resort“:
bzw. im Cronjob nur mit vorangestelltem Pfad:
Viel Glück.
Habe es heute mal auf einem anderem System probiert: da läuft das Skript. Dann habe ich das Skript auf meinen Haupt-NAS in einem anderen Ordner neu erstellt. Und es funktioniert. Frag mich nicht wieso, aber es liegt jetzt die gleiche Datei zwei Ordner „höher“ und läuft. Eigentlich gleich Rechte, keine Ahnung was es war. Wenn ich mal mehr Zeit habe probiere ich es nochmal in dem gewünschten Ordner, aber jetzt läuft alles wie gewünscht. Danke für deine Unterstützung.
Hallo
Wie ist es möglich die gelöschten Dateien von Hand zu löschen.
von Windows XP aus sind die .Recycling Ordner immer schreibgeschützt.
Hallo Bernd, du musst dich als Administrator/Systemverwalter auf der Weboberfläche des Server anmelden und den Papierkorb im Dateimanager der Weboberfläche löschen.
Alternativ kannst du dich via SSH (falls eingerichtet) anmelden (mit Putty unter Windows). Du brauchst root-Rechte =>
sudo -i
eingeben und mittels Befehlrm -R /Pfad/zum/Papierkorb
löschen.Hi
wenn ich ‚delrecycle.sh‘ als Cron ausführe erhalte ich folgende Meldung
find: missing argument to `-exec'
os=jessie
Bist du sicher, dass das Skript komplett kopiert hast?
Diese Fehlermeldung tritt oft auf, wenn
find
ohne „;
“ (Semikolon) abgeschlossen wird. Achte darauf, dass vor dem „;
“ ein Leerzeichen steht.Bei einigen UNIX-Versionen muss man vor dem
;
ein Leerzeichen und ein Backslash setzen: „\;
„, um „;
“ zu maskieren.Viel Erfolg. Hani
Hi Hani,
OK, Leerzeichen vor dem Semikolon war vorhanden, mit dem Backslash hat es dann aber funktioniert ( \;), Danke.
Danke für deine Rückmeldung. Schön da es jetzt bei dir läuft.
Nutzt du FreeNAS oder Nas4Free und in welcher Version?
Danke, Hani
PS: Ich habe die Skripte mit einem Hinweis auf deinen Kommentar angepasst.
CLEANUP_AFTER_DAYS=90
for PATHS in $(grep path /etc/samba/*.conf |grep „path = /“ |awk ‚{ print $NF }‘ |sort|uniq)
do
if [ -d $PATHS/.recycle/ ]
then
find $PATH/.recycle/* -atime +${CLEANUP_AFTER_DAYS} -exec rm -rf ‚{}‘ \;
find $PATH/.recycle/ -depth -type d -empty -exec rmdir {} \;
fi
done
enjoy.
Uralt, aber sehr hilfreich!
Danke
Kann schon mal passieren wenn man auf einen 9 Jahre alten Thread antwortet
Hallo,
vielen Dank für den Tipp! Ich benutze zwar ein selbst gebasteltes NAS, aber der Hinweis auf „find“ hat mich auf die richtige Idee gebracht 🙂 Auf meinem NAS gibt es viele Benutzer und mehrere Einhängepunkte. Und es war mir einfach zu nervig, die alle von Hand einzutragen – zudem wächst das Risiko, das bei einem neuen User zu vergessen. Daher hier meine Lösung als kleines Dankeschön! Beachte, dass bei „meinem“ Samba die Papierkörbe „.Trash-$UID“ heißen
#!/bin/bash
# duration in days
DURATION=30
TRASH=$(find /media/data-hd/ -maxdepth 2 -type d -name „.Trash-*“)
for item in „${TRASH[@]}“ ; do
find $item/* -mtime +$DURATION -exec rm -rf ‚{}‘ \;
find $item/* -depth -type d -empty -exec rmdir {} \;
done
Hallo Georg, danke für deinen Beitrag, der das Skript erweitert. Könnte für den einen oder anderen interessant sein.