Samba-Papierkorb

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.

  1. Neue Datei, z.B. delrecycle.sh, erzeugen
  2. 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 {} \;
  3. Das Skript delrecycle.sh auf eine Freigabe hochladen.
  4. 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
    Cronjob-Dialog in FreeNAS

    Cronjob in FreeNAS

    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.

21 Kommentare

  • 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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert