Ich suche Hilfe beim Erstellen eines Applescripts, das ausgeführt wird, wenn sich der Inhalt eines Ordners ändert

Ich würde mich sehr über Unterstützung bei folgendem freuen.

Mein Szenario:

Ich habe eine Mac-App, die RTF-Dateien generiert. Ich habe eine Android-App, die sich mit MultiMarkdown/Markdown-Dateien befasst.

Die Mac-App arbeitet mit Projekten, und diese enthalten eine beliebige Anzahl von Dateien. Es kann die Dateien in einem bestimmten Projekt automatisch mit einem Ordner synchronisieren. Im Wesentlichen wird es bei jeder Synchronisierung (beim Öffnen und Schließen und manuell) eine Reihe von Dateien in den Ordner legen. Alle Änderungen an diesem Ordner werden automatisch mit meinem Android-Gerät synchronisiert.

Ich muss sie jedoch vorher in .mmd-Dateien konvertieren und wieder in RTF konvertieren, wenn die Dateien geändert (oder neu) vom Android-Gerät eingehen.

Also hier ist, was ich im Sinn habe. Ich möchte die Dinge so einrichten, dass beim Synchronisieren von Dateien aus der Mac-App in ihren Zielordner diese Dateien automatisch von RTF in MMD konvertiert werden. Ich habe bereits die Skripte, die die eigentliche Konvertierung durchführen. UND wenn sich die MMD-Dateien ändern, werden sie automatisch in RTF-Dateien konvertiert. Dazu habe ich auch ein Skript.

Die Fragen, die ich habe, sind diese:

  1. Wie kann ich einen Ordner automatisch auf Änderungen an seinem Inhalt überwachen und ein Skript ausführen, wenn sich Dateien in diesem Ordner ändern?
  2. Wie könnte ich das in beide Richtungen funktionieren lassen, ohne alles in eine Endlosschleife zu werfen? Zuerst dachte ich, ich könnte Folgendes tun:

Zwei-Wege-Konvertierung:

  1. Erstellen Sie zwei Ordner auf dem Mac. Einer ist für RTF-Dateien, der andere für MMD-Dateien.
  2. Richten Sie die Mac-App ein, um ihre Daten aus dem RTF-Ordner heraus und hinein zu synchronisieren
  3. Stellen Sie das Mac-zu-Android-Synchronisierungssystem (Dropbox, Bittorrent Sync usw.) ein, um den Inhalt des MMD-Ordners mit einem Ordner auf dem Android-Gerät zu synchronisieren.
  4. Wenn sich der Inhalt von RTF-Ordnern ändert, konvertieren Sie die Dateien in MMD und legen Sie die Ausgabe im MMD-Ordner ab. Und umgekehrt.

Aber natürlich wird dadurch eine Endlosschleife erzeugt, da jede Aktion endlos die umgekehrte Aktion auslöst.

Ein möglicher Weg, diese Endlosschleife zu umgehen, könnte folgender sein:

  • Dem RTF-Ordner ist das Skript R zugewiesen. Wenn sich der Inhalt ändert, wird Skript R ausgeführt.
  • Dem MMD-Ordner ist das Skript M zugewiesen. Wenn sich der Inhalt ändert, wird Skript M ausgeführt.
  • Wenn eine Änderung im RTF-Ordner erkannt wird, deaktiviert Skript R als Erstes das Auslösen von Skript M. Das letzte, was Skript R tut, bevor es beendet wird, ist, Skript M wieder zu aktivieren. Auf diese Weise „bemerkt“ M nicht, dass sich der Ordnerinhalt ändert, während R seinen Inhalt mit frisch konvertierten Dateien aktualisiert.
  • Das Gleiche würde umgekehrt gelten.

Aber vielleicht gibt es einen besseren Weg?

Ich bin sehr daran interessiert, mehr über Scripting zu erfahren und dabei dieses Problem zu lösen.

Gibt es Leute mit umsetzbaren Ideen, wie ich das erreichen kann, was ich hier zu erarbeiten hoffe?

Antworten (2)

Ich würde ein Skript erstellen, das beide Ordner überwacht. Meine bevorzugte Sprache dafür ist Python. AppleScript ist für diese Art von Operation nicht besonders gut geeignet. Die Grundidee besteht darin, die beiden fraglichen Ordner auf FSEvents zu überwachen, und wenn eines auftritt, den Ereignisstrom schnell für den anderen Ordner zu entplanen, einige Konvertierungs- und Synchronisierungsvorgänge durchzuführen und dann den zuvor ungeplanten Ereignisstrom neu zu planen.

Das fertige Skript, hier heruntergeladen, mit modifizierten Versionen dieser Skripte, die Sie mir gezeigt haben. Die Installation von MacFSEvents erfolgt jetzt automatisch: https://www.dropbox.com/s/oylvewk90ezwb3s/File%20Sync.app.zip?dl=1

Hier sind die Schritte zur Verwendung:

Extrahieren Sie das Applet, klicken Sie mit der rechten Maustaste darauf und wählen Sie „Paketinhalt anzeigen“, öffnen Sie „Inhalt“ und „Ressourcen“ und bearbeiten Sie dann die Plist darin mit Ihren RTF- und MMD-Ordnerpaarungen. Sie können so viele Paare angeben, wie Sie benötigen, um miteinander synchronisiert zu bleiben, halten Sie sich einfach an das gleiche Format wie das, was ich in der plist verwendet habe: Ein Array pro Paar, das jeweils zwei Elemente enthält, wobei das erste Element der Pfad zu ist den RTF-Ordner, der zweite ist der Pfad zum MMD-Ordner. Sie sehen dies, wenn Sie die plist öffnen.

Dies sollte ohne Probleme funktionieren. Die Ordner werden nun auf jede Art von Änderung überwacht und die Dateien werden konvertiert und in den anderen Ordner übertragen.

Hallo Froggard. In Bezug auf das Problem, mit dem wir konfrontiert waren, dass Pandoc Überschriften bei der (MMD >) HTML > RTF-Konvertierung nicht handhabt ... Jemand in den Pandoc-Foren hat vorgeschlagen, dass wir dafür XSLT verwenden müssen. Er hat angeboten, ein paar Perl-Skripte zu entwickeln, die das tun. Könnten wir das dann in ein Applet einbauen?
Ganz sicher

Ich bin dafür, dass Leute lernen, wie man Dinge schreibt, aber für den täglichen Gebrauch und die Flexibilität ist die Neuimplementierung von Teilen von Hazel von NoodleSoft weniger leistungsfähig und effizient für eine Allzwecklösung.

Haselnusssymbol klein

Nochmals ein großes Lob an Froggard und Inspired Life für die hervorragende Antwort und die praktische Frage.

Der Hauptzweck meines Schreibens von Skripten für Menschen besteht darin, meine Erfahrung und mein Wissen über Skripterstellung zu erweitern. Es ist mir persönlich egal, ob es eine Anwendung gibt, die das kann, da der Spaß darin besteht, es selbst zu tun und es fehlerfrei funktionieren zu lassen. Heutzutage gibt es sehr wenig, was ich nicht schreiben kann, und da ich meine Fähigkeiten für die Arbeit, die ich mache, auf dem neuesten Stand halten muss, lohnt es sich, mit diesen Dingen die Extrameile zu gehen. Ich verstehe aber deine Befürchtung. Ich habe einige schrecklich gestaltete Skripte im Internet gesehen.
@Froggard Ja - ich beantworte dies für alle Leute, die noch keinen Juckreiz haben. Ich möchte Dutzende von Fragen auf der Website, die fragen, wie man diese bestimmten Anforderungen schreibt, und nach einem bestimmten Tool fragen. Python, AppleScript oder sogar wie man Hazel-Regeln für XYZ einrichtet. Ich sollte mir wahrscheinlich die Zeit nehmen, dies zu lösen und das in meinem Beitrag hier zu bearbeiten. Auch hier ist DIY so wichtig und warum ich die Frage und die Antwort gewählt habe.
Sicherlich. Abhängig von den Anforderungen einer Person gibt es oft mehr als eine richtige Antwort.
Danke bmike. Ich bin dann auf die Idee gestoßen, Hazel zu verwenden. Ich hatte Hazel vor einigen Jahren auf meinem Rechner ... vor zahlreichen Betriebssystem-Upgrades. Ich dachte mir, dass ich mich noch damit befassen müsste, dass es geeignete Skripte ausführt, und ich konnte auch nicht sofort sehen, wie ich es mit der in dieser Situation erforderlichen bidirektionalen Überwachung von zwei Ordnern umgehen könnte. Außerdem kostet es 30 US-Dollar und eine andere App, die ständig auf meinem Computer läuft, nur um diese eine Sache zu erledigen. Schien wie Overkill. Wohlgemerkt, wenn Froggard nicht so großzügig mit seiner Zeit umgegangen wäre, hätte ich mich vielleicht darauf verlegt, etwas zusammen mit Hazel in der Mischung zu hacken.
Ich weiß es jedoch zu schätzen, dass Sie sich mit diesem Vorschlag einlassen. Jemand anderes, der ein ähnliches Problem zu lösen hat, findet möglicherweise, dass der Hazel-Weg die beste Lösung in seinem Fall ist.