Automatic purge of Samba’s recycle bin on FreeNAS/NAS4Free
Samba can provide a recycle bin on a network share, as current operating systems do locally. Even FreeNAS and NAS4Free offers this feature and can be activated in its administration under Services|CIFS/SMB|Shares.
All deleted files and folders of a share are moved to this bin, physically localized on the network share. In comparison to a Windows’ recycle bin the maximum size is not settable. Therefore the recycle bin is able to overflow the share.
A cronjob and a tiny shell script can prevent this automatically.
In the file system of the share in FreeNAS/NAS4free the recycle bin is represented by the hidden folder .recycle. All deleted files and folder of a share of all users are stored there. The following method finally erases all files and folders of an appropriate age in this folder.
-
Create a new file, e.g.
delrecycle.sh
- Enter the following content to
delrecycle.sh
:#!/bin/sh find /mnt/[MountPoint]/.recycle/* -atime +[Age] -exec rm -rf '{}' \; find /mnt/[MountPoint]/.recycle/ -depth -type d -empty -exec rmdir {} \;
Adjust
[MountPoint]
(mount point of your share) und[Age]
(age of the files in days which you want to erase) to your environment and needs.Update 07/12/2015: As “gilada” posted in a German comment that the script does not work correctly. The error
find: missing argument to `-exec'
appeared. To get rid of this the semicolon (;) at the end of each line has to be masked by a backslash (\) in current UNIX versions. In my older FreeNAS-Version this was not necessary. I modified all scripts on this page. Thanks to “gilada” to point me to this issue.Example: If the name of your mount point is myshare and you want to finally erase all files and folders which were deleted for 90 days or more, the script
delrecycle.sh
looks like:#!/bin/sh find /mnt/myshare/.recycle/* -atime +90 -exec rm -rf '{}' \; find /mnt/myshare/.recycle/ -depth -type d -empty -exec rmdir {} \;
If you have more than one share you have to extend the script above. If your second mount point is called
myshare2
, the script is:#!/bin/sh find /mnt/myshare/.recycle/* -atime +90 -exec rm -rf '{}' \; find /mnt/myshare/.recycle/ -depth -type d -empty -exec rmdir {} \; find /mnt/myshare2/.recycle/* -atime +90 -exec rm -rf '{}' \; find /mnt/myshare2/.recycle/ -depth -type d -empty -exec rmdir {} \;
- Upload
delrecycle.sh
to your share. - Create a cronjob (System|Advanced|Cron) with root– privileges, which calls the command:
sh /path/to/MountPoint/delrecycle.sh
daily. Following the example above, the command should look like:
sh /mnt/myshare/delrecycle.sh
In the screenshoot above the script is called at every first and fifteenth day of a month at midnight.
Peculiarities of Samba’s recycle bin
Because Samba’s recycle bin behaves different to the Desktop ones on Windows, Mac or Linux the article Peculiarities of Samba’s recycle bin may help.
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.