Ordner und Dateien automatisch online synchronisieren

Ordner und Dateien automatisch online synchronisieren…

…in einer Apple-Umgebung.

Wenn es darum geht, viele Dateien mit sich ständig aktualisierenden Inhalten, im Internet zum herunter laden anzubieten, sollte das automatisch und möglichst im Hintergrund ablaufen. Das heisst: sobald eine entsprechende Datei geändert/hinzugefügt/gelöscht wird, sollte das Hochladen/Synchronisieren automatisch erfolgen. Gleiches Spiel bei Ordnern (Verzeichnissen).

Wie kann man also Ordner und Dateien automatisch online synchronisieren? Und das automatisch, sobald eine Datei geändert oder neu zu einem Verzeichnis hinzugefügt wird?

Händisch ist das sehr aufwendig und Zeit raubend.

Nach einigen Tests mit CaptainFTP und dem zusätzlichen Programm CrowzNest (überwacht Ordner und lädt im Hintergrund mit CaptainFTP die Dateien auf den FTP-Server); Mac OS X Ordnerüberwachung mit gekoppeltem AppleScript, Automator, usw. …

…bin ich bei folgender Lösung gelandet. Alles andere funktionierte nie so, dass es nicht dauernd kontrolliert und neu gestartet werden musste. Also sehr unzuverlässig.

[CaptainFTP und seine Kompagnons gibt es mittlerweile (2022) schon gar nicht mehr.]

Was passiert während des Arbeitsablaufs (Workflow)? Hier ein kurzer Überblick:

  • per Launchd-Services wird der entsprechende Ordner und/oder die Datei überwacht
  • ein AppleScript wird bei Änderungen des Ordners oder der Datei gestartet
  • Transmit lädt die Dateien auf den FTP-Server hoch
  • im Kundenbereich organisiert ein Skript die Darstellung (Auflistung) und das Herunterladen der Dateien

Wie prüft man mit den Launchd-Services Ordner und Dateien auf Änderungen?

Das funktionierte für mich am besten mit dem Programm LaunchControl (eigentlich kostenpflichtig; funktioniert aber erstmal auch ohne zu bezahlen). Es gibt noch Lingon. Das hat leider nicht so gute Einstellungsmöglichkeiten per grafischer Oberfläche, und funktioniert auch nicht so zuverlässig. Jedenfalls in der Umgebung in der der Arbeitsablauf eingerichtet werden musste.

Man kann die Datei natürlich auch von Hand anlegen/bearbeiten. Wer es möchte … mir war der Weg mit benutzerfreundlicher Klickoberfläche lieber.

Über LaunchControl habe ich dann Launchd-Jobs angelegt, die die entsprechenden Verzeichnisse oder eine einzelne Datei auf Änderungen prüft. Sobald eine Datei geändert, hinzugefügt oder auch nur das Verzeichnis geöffnet wird, startet die Synchronisierung.

Über Watch paths kann man Verzeichnisse und Dateien überwachen. Eine Überwachung am besten wie im unteren Bildschirmfoto gezeigt zusammen stellen. Allerdings hatte ich nach einigen Tests festgestellt, dass es durchaus auf einem anderen System leicht anders aussehen kann.

Unter Mac OS X Snow Leopard und auch El Capitan lief und läuft (2022) es immer noch wie unten gezeigt am besten und eben zuverlässigsten.

Bildschirmfoto 2022 02 11 um 11.56.09

Ganz Wichtig!
Bei Program to run nicht auf die .app verlinken. Den Paketinhalt anzeigen lassen und auf das Applet darin verlinken. Das AppleScript kann hieraus nicht direkt gestartet werden.


Die Konfiguration mit Lingon sieht ähnlich aus

Bildschirmfoto 2022 02 11 um 09.54.54
Bildschirmfoto 2022 02 11 um 09.55.06

Die Synchronisierung

Über die Launchd-Services wird jeweils ein AppleScript gestartet, welches Transmit (FTP-Client) mit der Synchronisation der Dateien auf dem Server beauftragt. Es werden auch nur die Dateien hochgeladen, die verändert wurden. Das funktioniert mit Transmit ganz hervorragend.

Transmit benutze ich auch, wenn es darum geht, diverse Skripte im Internet zu aktualisieren. Der Abgleich, was alt aufm Server ist, und gegen lokale Dateien ausgetauscht werden muss, funktioniert wirklich wunderbar. Ist zum Beispiel bestens dazu geeignet, CMS-Skripte aktuell zu halten, die keine integrierte Aktualisierungs-Option eingebaut haben.

sync

Das AppleScript

Die ursprüngliche Version hab ich mir hier besorgt. Das funktioniert so schon richtig gut. Auch als Ordneraktion.

Für meinen Fall musste ich es aber nocht etwas anpassen;

  • das Skript soll prüfen, ob ein gewisses Server-Volume schon vorhanden (auf dem Schreibtisch angemeldet) ist
  • wenn nicht: das Volume holen, etwas warten und das Skript neu starten
Bildschirmfoto 2022 02 11 um 12.24.15

Mein AppleScript-Wissen war/ist leider etwas eingerostet. Ich weiss nicht, ob man es mit den eingebauten Schleifen nicht noch etwas optimieren kann. Wer mag kann das. Freu mich über Tipps und/oder eine neue Version des Skriptes. Ansonsten kann jeder das vorhandene Skript benutzen/erweitern/verbreiten wie er grad Lust und Zeit hat.

Sofern das unter der GNU General Public Lizenz erfolgt.

Oder eben die Einstellungen (sind im Skript markiert) anpassen und selbst verwenden.

Hier kann man es herunter laden (die neue Version 1.1 ist seit dem 2. Februar 2016 online; neu ist eine zusätzliche Schleife, die verhindert, dass das Server-Volume zu oft geholt wird).

Vielleicht hilft es ja bei der einen oder anderen Problemlösung.

Manchmal kommt es zu Problemen (wofür ich keine Problemlösung im Skript habe):

  • wenn das Volume sich nicht einhängen (anmelden) lässt und eine zu lange Schleife entsteht (ich denke, das habe ich mit der Version 1.1 behoben)
  • die Verbindung zu einem FTP-Server nicht funktioniert

Aber meistens (in 97% der Fälle) läuft es zuverlässig. Bei den oben genannten Problemen hilft etwas Geduld. Die Skripte beenden, Transmit ebenso. Etwas warten, denn der Prozess läuft ja im Hintergrund, und sollte bald erneut starten. Auf jeden Fall zu dem Moment, sobald etwas in den angegebenen Pfaden verändert wird.


Dieses Skript und Ideen zu den LaunchdJobs werden in der Hoffnung zur Verfügung gestellt, dass es hilfreich und nützlich sein kann. Ohne Garantie. Also am besten nicht gleich in laufende Arbeitsabläufe integrieren. Besser in einer Testumgebung.


-- AppleScript - Transmit - synchronize a local directory to an FTP directory
-- Copyright (C) 2010 Lincoln Mullen / (C) 2022 Marco Dinkel
-- Released under the GPL. See README.

doit(true)
on doit(theTransmit)
	if theTransmit then
		
		tell application "System Events" to set diskNames to name of every disk
		
		if "daten" is in diskNames then
			
			-- display dialog "Startbereit!"
			
			tell application "Transmit"
				-- Prevent interactive alerts from popping up during script execution
				set SuppressAppleScriptAlerts to true
				
				-- CONFIGURATION - edit what you need to below
				-- replace "LincolnMullen" with the name of your favorite
				set remoteFavorite to item 1 of (favorites whose name is "Upload-Lesezeichen")
				-- replace everything in between "" to the remote path you want to sync TO
				set remotePath to "/wp-content/uploads/"
				-- replace everything in between "" to the local path you want to sync FROM
				set localPath to "/Users/admin/Documents/"
				-- END CONFIGURATION
				
				-- set a variable naming all the skip rules that are enabled in Transmit preferences
				set myRules to (skip rules whose enabled is true)
				
				-- Create a new window (and thus a single tab) for this script
				tell current tab of (make new document at end)
					
					-- Go into the local and remote folders that we want to sync.
					change location of local browser to path localPath
					connect to remoteFavorite
					change location of remote browser to path remotePath
					
					-- Run a sync from the current local folder to the current remote folder
					synchronize local browser to remote browser using skip rules myRules with automatically determine time offset
					-- Close the current window
					close
				end tell
			end tell
			
		else
			
			-- es muss erst die Windows-Platte geholt werden
			-- wenn sie nicht schon da ist und nicht mehrfach geholt werden soll
			-- mount volume "afp://NAS01._afpovertcp._tcp.local/windows_daten"
			mount volume "smb://file-srv/daten"
			
			-- Sicherheitspuffer: bis die Platte auf dem Schreibtisch erscheint
			delay 30
			
			-- Neustart des Skriptes
			doit(theTransmit)
			
		end if
		
	else
		
		-- Beenden
		doit(false)
		
	end if
	
end doit

Das ist nur ein Weg, wie man Ordner und Dateien automatisch online synchronisieren kann…

…es gibt noch einige weitere Möglichkeiten: mit GoodSync kann man sich z. B. auch recht schnell einen stabilen Workflow zusammen klicken, der lokale Verzeichnisse mit so allerhand Online-Verzeichnissen und Wolken synchronisiert…


Der Beitrag und das AppleScript wurden am Freitag, 11. Februar 2022 aktualisiert.

Und der Workflow funktionieret unter macOS Catalina und Transmit in der Version 5 weiterhin tadellos.