Dateisynchronisierung mit Filen-CLI auf macOS
Foto generiert von ChatGPT.

Dateisynchronisierung mit Filen-CLI auf macOS

13. Mai 2026 · Etwa 4 Minuten Lesezeit.

Filen ist ein »verschlüsselter Cloud-Speicher für Privatpersonen«. Ich plane, pCloud durch Filen zu ersetzen. Leider ist die Zero-Knowledge-macOS-App von Filen knapp 800 Megabyte groß. Aber es gibt ja noch filen-cli. Und das will ich mir als einfachen Hintergrundprozess einrichten.

In GitHub sowie über die Docs steht Filen-CLI als Download zur Verfügung.1 Wie die Authentifizierung funktioniert und Sync-Paare und Backups angelegt werden können, ist in der Dokumentation sehr gut mit Beispielen beschrieben.

Inhalt

AppleScript trifft Filen-CLI

Als Sync-Paare habe ich sowohl ein paar iCloud-Ordner als cloudToLocal angelegt sowie ein Verzeichnis, das ich als twoWay so verwenden möchte, wie vorher den pCloud-Sync.

Nun gilt es, Filen-CLI so zu starten, dass ich es später jederzeit wieder beenden kann – beides durch Skripte, die ich über das Skriptmenü aufrufe.2

Die Theorie: filen sync --continuous in AppleScript durch do shell script starten und laufen lassen. Ganz einfach.

Die Praxis: do shell script wartet, bis die Ausführung beendet ist. Das heißt, das Skript hängt, da in diesem Fall die Ausführung kontinuierlich läuft und nie endet.

Quasi im Hintergrund

In Bash können mit dem Zusatz > /dev/null 2>&1 & sämtliche Ausgaben und Fehlermeldungen ins Nichts geleitet werden. So blockiert der Befehl nicht die Shell. Allerdings lässt er sich nun auch nicht mehr einfach so beenden.

Um den Prozess später beenden zu können, muss er erstmal wiedergefunden werden. Dabei hilft ps. Mit dem Argument aux werden alle Prozesse (a) mit und (x) ohne Terminal des (u) aktuellen Users gelistet. Um Filen zu finden, kann die Ausgabe der Prozessliste mit grep durchsucht werden.

Die folgende Suche grep '[f]ilen sync --continuous' fördert dann den Filen-Prozess zutage – sofern er läuft.3 Der Komplette Aufruf lautet dann ps aux | grep '[f]ilen sync --continuous'. Ist das Ergebnis 0 bzw. leer, dann läuft Filen-CLI nicht. Andernfalls wird ein Text mit der Bezeichnung des Prozesses zurückgegeben.

In AppleScript muss also nur mittels try versucht werden, das Ergebnis des Aufrufs einer Variable zuzuweisen. Schlägt dies fehl, ist der Prozess nicht aktiv.

Wird der Prozess gefunden, so kann er mit killall filen beendet werden. Fertig.

Mit diesen Erkenntnissen lassen sich einfache Skripte schreiben, die den Filen-Sync starten und beenden können.

Im Ordner /Users/username/Library/Scripts abgelegt, stehen die Skripte dann im Skriptmenü zur Verfügung. Möchte man den Sync automatisch beim Login starten, so kann das Start-Skript in den Systemeinstellungen als Anmeldeobjekt eingerichtet werden.

Die Skripte

Hier folgen nun die beiden Skripte. Diese können Wahlweise als Text (.applescript) oder als Skript (.scpt) gespeichert werden. Beides funktioniert sowohl im Skriptmenü als auch in den Anmeldeobjekten beim Login.

Starten von Filen-CLI

on run
    try
        -- Läuft Filen bereits?
        set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
        display dialog "Filen läuft bereits." with title "Filen"
    on error errTxt number errNum
        -- Nein. Jetzt starten.
        do shell script "/usr/local/bin/filen sync --continuous > /dev/null 2>&1 &"
        try
            -- Testen, ob Filen läuft und Meldung ausgeben.
            set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
            display dialog "Filen sync gestartet." with title "Filen"
        end try
    end try
end run

Beenden von Filen-CLI

on run
    try
        -- Läuft Filen?
        set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
        display dialog "Filen sync läuft. Jetzt beenden?" with title "Filen" buttons {"Abbrechen", "Beenden"} default button 1
        set theresult to button returned of the result
        -- Soll Filen beendet werden?
        if theresult is "Beenden" then
            do shell script "killall filen"
            try
                set var to do shell script "ps aux | grep '[f]ilen sync --continuous'"
                display dialog "Fehler beim Beenden." with title "Filen"
            on error errTxt number errNum
                -- Filen wurde erfolgreich beendet.
                display dialog "Filen sync beendet." with title "Filen"
            end try
        end if
    end try
end run

Vorteile und Nachteile dieser Methode

Es ist eine einfache Lösung, die für meinen Anwendungsfall völlig ausreicht. Darum benötige ich auch nur rudimentäre Fehlerprüfungen.

Also Zero-Knowledge-Ansatz taugt die Lösung nicht. Es ist nicht sichtbar, ob der Sync-Prozess läuft. Die Nutzung von killall ohne Prozess-ID birgt außerdem das Risiko, dass ein anderer Filen-Prozess beendet wird. Eleganter wäre es natürlich, über die API von Filen zu gehen und selbst einen Filen-Client zu schreiben. Aber, wer weiß, vielleicht ist das eine Aufgabe für langweilige und verregnete Herbstabende.

Bonus: Einfacher Upload

Nachdem die Synchronisierung und die Backups im täglichen Betrieb mit den Skripten gut funktionieren, hat mir doch noch eine einfache Upload-Möglichkeit für Dateien und Ordner gefehlt.

Dazu braucht es nur Automator mit einem kurzen Bash-Skript – und fertig ist die Schnellaktion für den Finder.

In Automator einen neuen Workflow erstellen. Unter Utilities das Modul Run Shell Script wählen und festlegen, dass der Workflow Dateien und Ordner akzeptiert, und zwar im Finder. So kann später eine beliebige Datei oder ein Ordner gewählt und im Kontextmenü dann über die Schnellaktion Filen-Upload hochgeladen werden.

Das Shell-Skript-Modul muss Eingaben als Argumente akzeptieren. Das Argument wird dann im Skript als $1 verarbeitet. – Das heißt, hier wird immer nur eine Datei oder ein einzelner Ordner akzeptiert.

Die folgenden Zeilen sind das gesamte Shell-Skript. Es wird geprüft, ob ein Ordner oder eine Datei ausgewählt wurde. Ist es ein Ordner, wird zuerst ein neuer Ordner in Filen angelegt und dann alles dorthin hochgeladen. Ist es eine Datei, so wird diese direkt hochgeladen.

Bei mir habe ich dazu in Filen den Ordner /upload eingerichtet, in dem dann alles abgelegt wird.

if [[ -d $1 ]]; then
    /usr/local/bin/filen mkdir /upload/$(basename $1)
    /usr/local/bin/filen upload $1 /upload/$(basename $1)/
else
    /usr/local/bin/filen upload $1 /upload/
fi

Speichern. Fertig.


  1. Bevor ich es in /usr/local/bin kopieren und nutzen konnte, musste ich mittels xattr -rc macOS’ Sicherheitsbedenken zerstreuen und es durch chmod +x ausführbar machen.↩︎

  2. Das Skriptmenü lässt sich über die Einstellungen im AppleScript Editor aktivieren.↩︎

  3. In verschiedenen Beispielen wird die Verwendung der eckigen Klammern empfohlen, damit grep sich nicht selbst in den Ergebnissen finden kann.↩︎

Das Artikelbild wurde mit folgendem ChatGPT-Prompt generiert: »I need the photographic image of a black cat with yellow eyes. The cat is sitting on the keyboard of a MacBook Air M2 right in front of the display. The cat stares directly at the camera. It’s a cozy home office at night with warm ambient lighting, bookshelves, and a softly blurred city skyline through a window.«