Samba-Papierkorb

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.

  1. Create a new file, e.g. delrecycle.sh
  2. 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 {} \;
  3. Upload delrecycle.sh to your share.
  4. 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
    Cronjob in FreeNAS

    Cronjob in FreeNAS

    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.

21 comments

  • 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?

  • 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.

      • Wo wir die Fehlermeldung angezeigt? Wenn du das Script in der Shell ausführst?
      • Was passiert, wenn du die erste Zeile in der Shell ausführst?
      • Entspricht dein Script wirklich genau der Vorgabe mit angepassten Pfaden?
  • 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”:

      • delrecycle.sh ausführbar zu machen mit dem Shell-Befehl:
        chmod +x delrecycle.sh
      • Im Cronjob (oder testweise in der Shell) das Script ohne vorangestelltes “sh”, also direkt zu starten. In der Shell (mit vorangestelltem “./”):
        ./delrecycle.sh

        bzw. im Cronjob nur mit vorangestelltem Pfad:

        /Pfad/zum/Einhängepunkt/delrecycle.sh

      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 Befehl rm -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

  • 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

Leave a Reply to Hani Cancel reply

Your email address will not be published. Required fields are marked *