Automatisches umbenennen von Dateinamen in DEVONthink 4

Hallo liebe Entwickler von Devonthink,
ich habe mich darüber sehr gefreut, dass es eine neue Version von Devonthink gibt.
Ein beliebtes Thema bei Devonthink ist das automatische umbenennen von Dateinamen bzw. das automatische verschieben in entsprechende Gruppe. Mich würde interessieren, ob es, vielleicht auch mit Hilfe von KI, in Devonthink 4 neue Techniken und Möglichkeiten gibt, Dateinamen umzubenennen und dann die Datei in die richtigen Gruppe zu verschieben? Im Moment sieht das bei mir so aus:


Geht es jetzt noch flexibler?
Vielen Dank
LG Holger

Was genau meinst Du? ME kannst Du bislang nicht ohne Script abhängig vom Inhalt der Datei in Gruppen verschieben.

Mit einem Script ist das aber eine einfache Übung. Und das kann dann auch umbenennen – ich mache das ausschließlich per Code, meine intelligente Regel wählt nur die Dokumente aus und führt dann das Script aus.

Wenn das aktuell ausreichend ist, würde ich definitiv dabei bleiben. Im Gegensatz zur Verwendung von generativer AI ist das zuverlässig, schnell und kostenlos.

Aber ja, es gibt auch neue Möglichkeiten mit DEVONthin 4, s. z.B. die diversen Chat-basierten Platzhalter und die Chat-Aktionen für intelligente Regeln und Stapelverarbeitung.

Moin,
für den, der Code schreiben kann ja vielleicht keine “große” Sache, aber für den “normalen” User schon…
Auch meine Erwartungshaltung für die V4 wäre eine deutliche Erweiterungen der Funktionalitäten im Bereich der Regeln gewesen. Insbesondere, wenn es um die Behandlung externer / indizierter Elemente geht.
Das wäre mir persönlich wichtiger als der ganze KI-Kram, den ich persönlich aktuell eher nicht in DT verwenden würde. (Ich lass doch nicht die KI meine Datenbanken durchsuchen und das auch noch in die Welt rausposaunen.)

Ich hätte mich über einen überarbeiteten Bereich der Suche gefreut, ebenso das oben angesprochene Dateihandling in Regeln.
Bisher ist die DT4 Beta eher ernüchternd vom Umfang der Funktionalitäten.

Aber ich schweife ab.. Ich kann Holger-erf nur zustimmen und mir in dem Bereich der Regeln - in Anlehnung an Hazel - zukünftig mehr Funktionalität für Workflows wünschen, die ich nicht programmieren muss.

Man kann mit solchen Systemen, wie es intelligente Regeln sind, nicht beliebig komplexe Aufgaben lösen. Einfaches Beispiel: Du möchtest deine Kontoauszüge je nach Konto in Gruppen mehrerer Datenbanken verschieben

  • Konto 1234 soll in Datenbank “privat”, Gruppe “DKB” landen
  • Konto 5678 soll in Datenbank “geschäftlich”, Gruppe “ING” landen

Um so etwas mit einer Regel erledigen zu können, brauchst du ein if … else oder eine Datenstruktur, die Zeichenketten Objekten zuordnet. Was technisch vielleicht möglich ist, aber wie soll das UI dafür aussehen? Schon das jetzige stellt ja für den “normalen” User (wer legt eigentlich fest, was “normal” ist?) eine Herausforderung. Der/die muss ja schon verstehen, was der Unterschied zwischen “Alle” und “Einige” bei den Bedingungen bedeutet, und wie man die kombiniert.

Ich habe keine Ahnung, ob/was die Entwickler planen. Aber ich weiß, dass solche Aussagen keine sinnvollen Anforderungen für eine Entwicklung definieren.

Die Suche hat neue Funktionen/Operatoren, jedenfalls laut Release Notes.

Auch Hazel kann Dokumente nur mithilfe von Scripts in die Gruppen von DT einsortieren. Same, same but different.

Je komplexer die Aufgabe, desto weniger “normal” (ich hasse dieses Wort) ist sie. Wenn sie häufig auftritt und du sie automatisieren willst, wirst du wohl lernen müssen, Code zu schreiben. Oder jemanden dafür bezahlen, der das für dich tut. Willst du beides nicht, ist es dir vielleicht nicht wichtig genug. Aber die Hoffnung, beliebig komplexe Aufgaben mit beliebig simplen Tools ohne Lernaufwand bewältigen zu können, darfst du fahren lassen.

1 Like

Naja, vielleicht verstehe ich das auch nicht richtig, aber meine ganze Ablage wird mithilfe von Hazel-Regeln genau dorthin verschoben, wo sie nach meist automatischer Umbenennung auch hin sollen.
Und dafür benötige ich kein Script.

Und ja, natürlich muss ich diese Regeln auch vorher erstellen und auch den Pfad entsprechend definieren.
Ggf. muss ich auch mal die Regel anpassen, weil sich wegen einer neu erstellten Regel etwas überschnitten hat.

Das habe ich mal vor knapp einem oder zwei Jahren versucht, mit den intelligenten Regeln von DT abzubilden - na way! Nicht annähernd.

Ich denke mal, so hat der HaubenTaucher das auch gemeint

Vorab: Ich habe weder etwas gegen Hazel noch gegen intelligente Regeln und benutze beide. Allerdings Hazel immer noch in Version 5, da ich das Upgrade nicht brauche.

Aber ich bin mir auch über die Grenzen dieser Tools klar.

Genau: Regeln, Plural. Du brauchst, wenn ich mich nicht irre, für jede Kombination aus Muster und Ziel eine eigene Regel, außer in den Fällen, in denen das Muster schon das Ziel festlegt (“alles was ‘DKB’ enthält, kommt in die Gruppe ‘DKB’”).

Wenn Du also n Muster und Ziele hast, brauchst Du n Regeln. Die alle bis auf zwei Details identisch sind. Das ist, mit Verlaub, unelegant und umständlich. Denn dasselbe lässt sich genauso gut mit einem einzigen Script erreichen, in dem eine Datenstruktur die Zuordnungen definiert (in symbolischem Code):

const Zuordnung = { 
  "Muster1": {datenbank: "DB1", gruppe: "gruppe1"},
  "Muster2": {datenbank: "DB2", gruppe: "gruppe2"},
  usw.
}
  Object.keys(Zuordnung).forEach (muster => {
    record.moveTo(Zuordnung[muster].datenbank, Zuordnung[muster].gruppe);
})

Tja.

Keine Ahnung. Der/Die OP jedenfalls zeigte eine Regel, die anhand eines regulären Ausdrucks die Dateien umbenennt – und zwar nach einem denkbar simplen Schema.

Und er/sie fragte nach Verbesserungen intelligenter Regeln im Zusammenhang mit dem Verschieben in Gruppen. Daraus habe ich geschlossen, es gehe um eine Regel, die das für mehrere Arten von Dokumenten intelligent erledigt. Darauf bezog sich meine Antwort – geht nicht.

also ich weiß gar nicht, was Du immer mit JavaScript und DT hast und das promotest?

Wie auch immer, die Limitationen von JS ist ein echter Alptraum für DT users, die eine automatische und leicht zugängliche Lösung suchen.

Limitationen JS und DT

  • JS läuft nur in eingeschränktem Rahmen JXA ist zwar vorhanden aber JXA ist eine abgespeckte Version von dem, was man von einem Browser erwartet.

  • Kein DOM (document.getElementByID) oder Webseitenmanipulationen.

  • Kein Zugriff auf Node,js (require, fs, http)

  • Apple’s JavaScriptCore ist aus 2015-2017!!

  • moderne Features, wie async/await oder Promise.allSettled fehlen
    keine einfachen HTTP Requests fetch() oder XMLHttpRequest - außer Du nutzt über Umwege AppleScript oder externe Tools

  • DT will, dass Automationen lokal und sicher bleiben - Starker Focus auf Dateiensystem und interene DBs

  • Zugriff auf fremde Ordner oder Apps nur mit Sondergenehmigung (Automatiion Permissions)

  • Komolexe Workflows wie intelligente Gruppen bearbeiten, detailierte Sucheringstellungen oder Erweiterungen direkt beeinflussen geht nicht…

  • Performance bei großen Datenmengen - extrem langsam im JXA-Kontekt.

  • Kein Mutlithreading oder Nebenläufigkeit

Zur Automaisierung:

  • Keine Live-Überwachung von neuen Dokumenten - EventListener / Watcher - JS hat keinen echten EventListener - muss über Timer geregelt werden.
  • gleichzeitig viele Dokumente ändern Tag ändern / Metadaten - geht nicht da JXA single-threaded ist. Kein Promit kein async/await
  • sequentieller Ablauf bei großen Datenmengen - extrem langsam

Hazel - Automatiion

Ich weiß nicht, wie Du mit den Regeln in Hazel arbeitest - wahrscheinlich kopierst Du diese. Diese ist nicht nötig,

Meine Regeldatei ist wie folgt

Regeln für Hazel-Import mit UND / NICHT Logik

[AND] Steuer, 2025 → /Finanzen/Steuern/2025
[AND] Versicherung, Police → /Dokumente/Versicherungen/Policen
[AND-NOT] Steuer, !Entwurf → /Finanzen/Steuern/Fertig
[AND] Projekt X, Rechnung → /Projekte/ProjektX/Rechnungen

Das ist eine txt - Datei die über Cloud gesynct wird - heißt ich kann die eine Zeile von überall einfügen oder ändern.

Also - die Regelerstellung ist nicht kompliziert und auch für DT - Nutzer machbar.

Ich habe auch nur ein Skript was alles macht was ich benötige:

Funktionen:

  • Überwacht eingehende Dokumente
  • Prüft ob ein PDF bereits Text enthält
  • Falls kein TextOCR-Scan via DEVONthink/Abbyy
  • Liest Regeln aus der rules.txt in iCloud oder Dropbox
  • Sucht Schlagwörter im Text
  • Unterstützt UND und NICHT Bedingungen
  • Importiert Dokumente in DEVONthink in die richtige Gruppe
  • Setzt automatisch Tags
  • Schreibt alle Aktivitäten in ein Logfile
  • Zeigt Mac Notifications nach jedem Import - optional

Flowchart ist wie folgt

flowchart TD
Start → Hazel_erkennt_Datei
Hazel_erkennt_Datei → Prüfe_Text
Prüfe_Text -->|Kein Text| OCR_mit_Abbyy
OCR_mit_Abbyy → Prüfe_Text_nochmal
Prüfe_Text_nochmal -->|Text vorhanden| Regeln_laden
Prüfe_Text -->|Text vorhanden| Regeln_laden
Regeln_laden → Schlagwörter_prüfen
Schlagwörter_prüfen -->|Treffer| Import_nach_DEVONthink
Schlagwörter_prüfen -->|Kein Treffer| Standard_Import
Ordner Prüfen -->|Kein Treffer| dann lege den einfach an
Import_nach_DEVONthink → Notification
Standard_Import → Notification

Insgesamt lässt sich das wie folgt aufgliedern:

Feature Hazel + Skript JavaScript (JXA)
OCR auf PDFs :white_check_mark: (mit Abbyy/DEVONthink) :cross_mark: (nicht möglich direkt)
Dynamische Regeln (Cloud) :white_check_mark: :cross_mark:
Textinhalt aus PDFs auslesen :white_check_mark: Schnell :cross_mark: Alt und langsam
UND/NICHT Schlagwort-Logik :white_check_mark: :cross_mark: Sehr schwer
Mac Notifications :white_check_mark: :large_orange_diamond: Teilweise
Vollständiges Logging :white_check_mark: :large_orange_diamond: Teilweise

Und das alles mit Hazel und Mac-OS super Funktionen - ohne eingeschränktes JS.

Ich wollte dies nur mal klarstellen, dass JS nicht wirklich attraktiv für DT - Nutzer ist, hier ist Hazel und einer Textdatei wesentlich besser geeignet.

Ich möchte auch keinen Sturm jetzt lostreten, sondern nur die Vorteile von Hazel in Verbindung mit DEVONthink geben, sodass DT-Nutzer eine einfache Automatisierung nach ihren Vorstellungen ohne großes Coden (egal welche Sprache auch immer) - bewerkstelligen können.

PS: Geht auch mit Hazel 5 :smiley:

4 Likes

Hallo Steffi,

danke für die ausführliche Beschreibung. Das mit der Textdatei war mir neu, und es entspricht ja dem, was ich hier als Pseudo-Code notiert hatte: Eine tabellarische Zuordnung von Mustern zu Zielen.

Grundsätzlich darf jede:r nutzen, was sie/er möchte. Und auch darüber schreiben, denke ich. Wenn man nicht darüber schreibt, erfahren andere nicht, was möglich ist. Deshalb noch mal Danke für deine Erläuterungen zu Hazel.

Zu deinen “Limitationen JS und DT”:

  • Ja, JXA ist nicht das, was “man von einem Browser erwartet”
  • Ja, es hat kein DOM-Objekt und bietet eigentlich keine Webseitenmanipulation

Aber: Wer bitte braucht ein DOM in DT? JXA heißt ja nicht “JavaScript im Browser”, sondern “JavaScript for Automation”. Und diese Aufgabe, nämlich das Automatisieren dafür eingerichteter Apps auf macOS erfüllt es mE besser als AppleScript. Mit dem hättest du vielleicht vergleichen sollen – das hat nämlich auch kein DOM und keine Webseitenmanipulation, trotzdem nutzen es viele für das Automatisieren von DT.

  • Konzepte wie async/await und Promise.allSettled fehlen in JavaScriptCore
    Mag sein. Aber wer braucht das für das Automatisieren von DT oder irgendwelchen Apps? Diese modernen Konzepte fehlen auch in AppleScript, btw, und trotzdem benutzen es viele Leute.

  • Fetch und XMLHttpRequest lassen sich weder in AS noch in JXA direkt abbilden. In beiden Fällen muss man auf NSData und seine Methode initWithContentsOfURL via Objectve C zugreifen. JXA braucht dafür kein AppleScript, und man braucht auch keine “externen Tools”.

Ich weiß nicht genau, was du damit sagen willst. Aber grundsätzlich ist Scripting, egal von welcher Applikation, ein extrem unsicherer Prozess. Man kann eigentlich, dank doShellScript alles machen, was einem:r auf der Kommandozeile möglich ist, und zwar von einem Script aus, das in DT läuft. Schlimmer noch: Es ist sogar möglich, Befehle als root auszuführen. Und zwar von jedem JXA/AS-Script aus. Yuck.

Jein. Das Ausführen von Automationen in anderen Apps erfordert permissions. Aber die müssen nur einmal erteilt werden. Und das hat nichts mit JXA zu tun, das gilt auch für AppleScript. Und was sind “fremde Ordner”? Für die sollten dieselben Zugriffsrechte wie für alle anderen Apps auch gelten. Abgesehen davon: Entweder möchtest du es sicher (wie im vorherigen Punkt) oder nicht. Da müsstest du dich entscheiden. Bzw.: Mit Scripting geht nur genauso sicher wie auf der Kommandozeile.

  • Warum sollte man intelligente Gruppen nicht bearbeiten können? Es gibt die Properties searchPredicates und searchQuery, mit denen sich die Eigenschaften einer intelligenten Gruppe festlegen lassen. In AppleScript und in JXA. Was du mit “Sucheringstellungen” meinst, weiß ich ebenso wenig wie was “Erweiterungen beeinflussen” in diesem Zusammenhang bedeutet.

Performance bei großen Datenmengen: Beispiele? Was und wie groß sind die “Datenmengen”, und was sind die Operationen? Und womit vergleichst du die Performance? JXA ist sicherlich nicht langsamer als AppleScript, denn beide benutzen AppleEvents. Und beide sind sicherlich langsamer als native Zugriffe zB auf Datenbanken.

Kein Multithreading – naja. Braucht man das im Zusammenhang mit Applikationsautomatisierung? Besser noch: Will man das, angesichts des Aufwands bei der Programmierung?

Was du unter “Automatisierung” listet, liest sich nett, hat aber auch nix mit JXA und dem dafür vorgesehenen Anwendungsbereich zu tun. Natürlich hat die Browser-Version von JS Event-Handler (document.addEventHandler). Und andere Varianten von JS haben die eben nicht – schließlich hängt das von dem System ab, auf dem sie laufen. Wenn man mag, kann man natürlich FSEventStream aus Apple’s Core Services verwenden, um sich so etwas zu basteln. Wieder mit der ObjC-Bridge.

“gleichzeitig etwas ändern geht nicht” – Ja, und? Warum muss das gleichzeitig sein? Wer braucht das in diesem Zusammenhang?

“extrem langsam” – Da du das jetzt zum zweiten Mal erwähnst, hast du sicherlich fundierte Performancedaten und Vergleiche mit anderen Verfahren zur Applikationsautomatisierung?

Dein Vergleich Hazel vs JXA ist partiell etwas schief.
“OCR auf PDFs nicht möglich direkt” Wieso “direkt”? Was meinst du damit? JXA kann genauso gut DT/Abby für OCR benutzen wie Hazel:

if (record.wordCount() === 0) {
      ocrRecord = app.ocr(record.path(), { 
        file: record.path(), 
        waitingForReply: true});
      app.delete({record: record, in: record. parents[0]});
}

“Dynamische Regeln”: Brauche ich nicht, wenn ich eine tabellarische Zuordnung habe. Das hatten wir schon – da gibt es keinen Unterschied zwischen Hazel und JXA/DT, außer der fehlenden Synchronisierung via Cloud. Was an DT liegt, nicht an JXA.

“Textinhalt aus PDFs auslesen”: Inwiefern “langsam” (das ist der dritte Hinweis auf Performance-Mängel ohne Zahlen und ohne Vergleich)? Die Frage ist doch, wie die Software das Textlayer aus einem PDF ausliest. Meine Vermutung: Hazel und DT (also in dem Zusammenhang auch JXA und AppleScript) bedienen sich Apple’s PDFKit und dessen Property string am PDFDocument. Wenn das so ist, dann sollte es keinen nennenswerten Geschwindigkeitsunterschied geben. Oder wie liest Hazel deiner Meinung nach den Text aus einem PDF?

Wie gesagt: Jede:r soll nutzen, was sie:er mag. Und ich habe was über Hazel gelernt, was ich nicht wusste. Ich wollte das Programm keineswegs schlechtreden und hatte extra “wenn ich mich nicht irre” eingefügt.

Aber Vergleiche von Äpfeln und Birnen, wie du sie her anstellst, helfen nicht weiter. Es gibt nicht “das” JavaScript – es gibt ECMAScript (standardisiert) und es gibt Implementierungen in bestimmten Umgebungen, die alle ECMAScript umsetzen. Zusätzlich können sie bestimmte APIs (XMLHttpRequest, zB) oder globale Objekte (DOM, zB) implementieren. Das macht JXA auch mit Application und $. Und natürlich nicht mit DOM etc. Aber wenn du willst, kannst du zB mit doJavaScript in einem DT-Script ein geöffnetes HTML-Dokument manipulieren. Nicht schön, aber möglich.

JavaScriptCore mag aus 2015 stammen, aber es hat die wesentlichen Teile von ECMAScript 2025 implementiert, zB Set.prototype. Apple zieht das vermutlich deshalb nach, damit es nicht für Safari und sein OS zwei verschiedene JS-Engines pflegen muss. Promise und die verwandten Themen sind allerdings in JXA nicht so verwendbar, wie sie es sein sollten. Keine Ahnung, woran das liegt und ist mE für das reale Leben zurzeit nicht relevant.

1 Like

Super, das Du etwas neues gelernt hast. Ich will JS auch nicht schlecht reden, sondern nur darauf hinweisen, dass es für die meisten Nutzer wahrscheinlich leichter ist Hazel zu nutzen, um ihren Anforderung gerecht zu werden.

Viele Grüße
Steffi

Nach dem ersten Zitat folgt die Liste imaginierter Einschränkungen, die nichts mit der Frage zu tun haben, ob Hazel für die meisten Anwender einfacher zu nutzen ist (was ich nicht bestreite). Auch Hazel kann ja nicht auf das DOM zugreifen, es hat keine Nebenläufigkeit usw usw. Und lustigerweise ist sein UI Englisch, sodass also zumindest Sprachkenntnisse darin nötig sind :wink:

Selbstverständlich ist ein Programm mit GUI für Menschen, die nicht programmieren können oder wollen, einfacher zu nutzen. Obwohl … In deinem Vergleich am Ende sprichst du ja auch von “Hazel + Script”. Scheint also nicht so ganz ohne Programmierung zu gehen?

Zu den Performance-Nachteilen von JXA/JS (gegenüber was?) schreibst du leider nichts. Geheime Werte, oder war das nur ein Gefühl?

1 Like