Gibt es ein macOS-Äquivalent zum Windows-Befehl assoc?

Ich möchte eine Dateizuordnung auf dem Mac mit einer Art Skript ändern. Ich weiß, dass ich so etwas in Windows mit dem assocBefehl machen kann.

Gibt es unter macOS etwas Skriptfähiges, das eine ähnliche Aufgabe erfüllt? Es ist mir egal, ob es in Bash (meine Präferenz), AppleScript oder etwas in Automator ist.

Der Befehl ist mir bekannt, dutilaber ich möchte ihn ohne zusätzliche Software ausführen können.

Antworten (2)

Ändern der Dateizuordnung für eine einzelne Datei oder eine Reihe von Dateien (AppleScript)

Dieses Skript zeigt zunächst, dass die Standardanwendung für einige Textdateien auf meinem System auf TextEdit eingestellt war . Dann ändert es die Dateizuordnung für diese bestimmte Datei, sodass sie jetzt mit Atom geöffnet wird . Schließlich verknüpft es alle Textdateien auf dem Desktop mit der Atom- Anwendung.

tell application "System Events"
    get the default application of the file "/path/to/some file.txt"
        --> alias "Macintosh HD:Applications:TextEdit.app:" of application "System Events"

    # Individual file:
    set the default application of the file "/path/to/some file.txt" to ¬
        the path to the application named "Atom"

    # A set of files:
    set the default application of every file of the desktop folder whose ¬
        name extension = "txt" to the path to the application "Atom"
end tell

Ändern der Dateizuordnungen für alle Dateien eines bestimmten Typs (JXA)

Mit JavaScript for Automation können Sie Core Foundation-Funktionen auf eine Weise implementieren, die mit AppleScriptObjC nicht möglich ist, um mit Launch Services auf Systemebene zu interagieren und die Dateizuordnung für einen bestimmten Dateityp zu ändern.

Hier habe ich reine Textdateien (diese haben .txtstandardmäßig eine Erweiterung) als Ziel ausgewählt und die Standardanwendung, die darauf reagiert, auf Atom umgestellt :

ObjC.import('CoreServices');

var contentType = 'public.plain-text';
var bundleID = Application('Atom').id();

$.LSSetDefaultRoleHandlerForContentType(
            contentType, 
            $.kLSRolesAll, 
            bundleID
        );

Der Dateityp muss über einen Uniform Type Identifier angesprochen werden . Dies sind spezielle Textzeichenfolgen, die eine bestimmte Klasse oder einen bestimmten Gegenstandstyp eindeutig identifizieren. Der Link führt Sie zu einer Seite, die die vom System von Apple deklarierten UTIs für alle wahrscheinlichen Dateitypen auflistet, an denen Sie interessiert sein werden. Achten Sie darauf, nicht einfach diejenige auszuwählen, die auf den ersten Blick Ihren Anforderungen entspricht, wie es UTIs sind in einer Art Vererbungsbaum strukturiert. Daher hätte ich faul auswählen können public.text, was ich zuerst in der Liste gesehen habe, bis wir beim weiteren Lesen erfahren, dass diese UTI ein Basistyp für alle Texte ist, die HTMLund RTFDateien enthalten würden.

Genau richtig für die eigentliche Frage, die gestellt wurde – wie ändere ich die Dinge. Tolle Lösung und lehrt auch viel.
Gibt es eine Möglichkeit, alle Anwendungen aufzulisten, die einer bestimmten Datei zugeordnet sind?
@VK Ja, Sie können die NSWorkspaceObjective-C-Instanzmethode verwenden URLsForApplicationsToOpenURL:und ihr eine NSURL-ähnliche Dateireferenz für die betreffende Datei übergeben. Es gibt ein Array von NSURLs zurück, eines für jede Anwendung, die zum Öffnen der Datei registriert ist.

Es gibt kein direktes Äquivalent zu assoc . Die Apple-Dateizuordnung ist ganz anders implementiert als Windows. Die Dateimetadaten haben viele Variablen, die sich auf Startdienste auswirken, und das Zuordnen einer bestimmten Datei zu einer bestimmten App kann mehrere Faktoren beinhalten.

Das macOS-System verwendet eine Launch Services-Datenbank, um Dateitypen und sekundär Dateierweiterungen Anwendungen zuzuordnen, die sie öffnen. Das nächste Analogon wäre ein assocDienstprogramm lsregister, das die Datenbank und die API für die Befehlszeile verfügbar macht.

Es ist im Systemordner Core Services vergraben, dem Framework, das die LaunchServices enthält.

Sobald Sie wissen, nach welchem ​​Dienstprogramm Sie suchen müssen , finden Sie hier jede Menge guter Fragen und Antworten, ebenso wie jede Menge exzellenter Blog-Posts , Entwicklerhandbücher und offizielle Dokumentation .

Da ich /usr/local/bin in meinem Pfad habe, verlinke ich es normalerweise dort, damit ich es hosten kann:

mac:~ me$ ln -s /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister  /usr/local/bin
mac:~ me$ lsregister
lsregister: [OPTIONS] [ <path>... ]
                      [ -apps <domain>[,domain]... ]
                      [ -libs <domain>[,domain]... ]
                      [ -all  <domain>[,domain]... ]

Paths are searched for applications to register with the Launch Service database.
Valid domains are "system", "local", "network" and "user". Domains can also
be specified using only the first letter.

  -kill     Reset the Launch Services database before doing anything else
  -seed     If database isn't seeded, scan default locations for applications and libraries to register
  -lint     Print information about plist errors while registering bundles
  -lazy n   Sleep for n seconds before registering/scanning
  -r        Recursive directory scan, do not recurse into packages or invisible directories
  -R        Recursive directory scan, descending into packages and invisible directories
  -f        force-update registration even if mod date is unchanged
  -u        unregister instead of register
  -v        Display progress information
  -gc       Garbage collect old data and compact the database
  -dump     Display full database contents after registration
  -h        Display this help