Ich möchte eine Dateizuordnung auf dem Mac mit einer Art Skript ändern. Ich weiß, dass ich so etwas in Windows mit dem assoc
Befehl 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, dutil
aber ich möchte ihn ohne zusätzliche Software ausführen können.
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
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 .txt
standardmäß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 HTML
und RTF
Dateien enthalten würden.
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 assoc
Dienstprogramm 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
Fahrrad
HiFile.app - bester Dateimanager
CJK
NSWorkspace
Objective-C-Instanzmethode verwendenURLsForApplicationsToOpenURL:
und ihr eineNSURL
-ähnliche Dateireferenz für die betreffende Datei übergeben. Es gibt ein Array vonNSURL
s zurück, eines für jede Anwendung, die zum Öffnen der Datei registriert ist.