Association de fichiers de modification Mac OSX par fichier sur la ligne de commande

10

J'ai besoin de modifier par lots l'application associée à certains fichiers via la ligne de commande. Je ne vais pas changer l'association de fichiers pour une certaine extension de fichier, je cherche en fait à cibler des fichiers spécifiques à ouvrir dans une application différente de l'association par défaut pour ce type de fichier. Je ne veux pas modifier l'application par défaut pour cette extension de fichier dans son ensemble, juste pour les fichiers spécifiques que je cible.

En ce moment, je sélectionne tous les fichiers que je veux changer dans le Finder, en appuyant sur l'option + commande + i pour ouvrir obtenir des informations pour plusieurs fichiers et en modifiant l'application pour ces fichiers. C'est un peu ennuyeux.

Rob
la source

Réponses:

6

Ces informations sont stockées dans la fourchette de ressources du fichier ( Wikipedia ). Ces fourchettes de ressources sont exposées en tant qu'attributs étendus ( Wikipedia ):

$ ls -l@ somefile.txt 
-rw-r--r--  1 danielbeck  staff  0 18 Mär 19:00 somefile.txt

# setting non-default application using Finder

$ ls -l@ somefile.txt 
-rw-r--r--@ 1 danielbeck  staff  0 18 Mär 19:01 somefile.txt
        com.apple.ResourceFork  1338 

L'édition à partir de zéro est probablement assez pénible - beaucoup de données binaires:

$ xattr -p com.apple.ResourceFork somefile.txt 
00 00 01 00 00 00 05 08 00 00 04 08 00 00 00 32
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 04 04 00 00 00 32 2F 55 73 65 72 73 2F 64
61 6E 69 65 6C 62 65 63 6B 2F 41 70 70 6C 69 63
61 74 69 6F 6E 73 2F 53 75 62 6C 69 6D 65 20 54
65 78 74 20 32 2E 61 70 70 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 01 00 00 00 05 08
00 00 04 08 00 00 00 32 0C 00 00 00 C0 05 00 00
00 1C 00 32 00 00 75 73 72 6F 00 00 00 0A 00 00
FF FF 00 00 00 00 19 00 00 00

Mais vous pouvez traiter ces fourchettes de ressources comme des fichiers. Par exemple:

$ open somefile.txt # opens in Sublime 2
$ cp somefile.txt/..namedfork/rsrc openInSublime2rsrc
$ open otherfile.txt # opens in TextEdit
$ cp openInSublime2rsrc otherfile.txt/..namedfork/rsrc
$ open otherfile.txt # opens in Sublime 2

/..namedfork/rsrc est la façon dont la fourchette de ressources est exposée aux applications POSIX (c'est-à-dire probablement tout ce que vous faites dans Terminal).

Il vous suffit donc de créer un fichier "modèle" à partir d'une fourchette de ressources existante (dans cet exemple openInSublime2rsrc), et vous pouvez ensuite le copier dans vos autres fichiers.

Daniel Beck
la source
1
Cette solution a fonctionné jusqu'à Lion. La copie dans un fichier / rsrc me donne une erreur ": Pas un répertoire". Retour à la case départ :(
Rob
1
@Rob Essayez d'utiliser à la somefile.txt/..namedfork/rsrcplace. somefile.txt/rsrca été déconseillé il y a un certain temps.
Daniel Beck
Daniel Beck-vous êtes une bouée de sauvetage, merci beaucoup.
Rob
Vous n'avez pas besoin de modifier directement les fourches de ressources - voir ma réponse ci-dessous, mais le résumé est que vous pouvez utiliser des utilitaires appelés Rez et DeRez pour modifier les fourches de ressources. Étant donné qu'il s'agit d'outils de développement pris en charge, vous êtes moins susceptible d'avoir un problème.
mauvedeity
5

Reprenant la réponse de Daniel Beck ci-dessus, ces informations sont en effet stockées dans la fourchette de ressources du fichier. Apple fournit deux utilitaires, appelés "Rez" et "DeRez" avec les outils de développement, qui vous permettent de manipuler les fourchettes de ressources. En particulier, vous pouvez pousser une fourchette de ressources dans un fichier avec Rez.

Pour modifier l'association d'un seul fichier à partir de la ligne de commande, créez d'abord un fichier du bon type et modifiez manuellement son association à l'application dans laquelle vous souhaitez qu'il s'ouvre. Cela crée la fourchette de ressources dans le fichier - si vous ne le faites pas ' Pour ce faire, il n'y aura aucune information à copier. Ensuite, retirez la fourchette de ressources avec DeRez, comme ceci (en supposant un fichier foo.txt et que l'application que vous souhaitez utiliser est Firefox.app).

DeRez foo.txt > foo.r

Cela va créer un fichier appelé foo.r qui est la fourche de ressource décompilée en tant que fichier texte. Cela ressemblera à ceci:

data 'usro' (0) {
    $"0000 001A 2F41 7070 6C69 6361 7469 6F6E"            /* ..../Application */
    $"732F 4669 7265 666F 782E 6170 7000 0000"            /* s/Firefox.app... */
    $"0000 0000 0000 0000 0000 0000 0000 0000"            /* ................ */

Vous pouvez le modifier si vous souhaitez en créer un à partir de zéro, mais vous devez obtenir le format exact ou cela ne fonctionnera pas. Ce ne sont que des caractères hexadécimaux décrivant le chemin d'accès au bundle d'application que vous souhaitez, terminé par un zéro.

Vous pouvez voir un message indiquant que la fourchette de ressources est vide et non initialisée. Si tel est le cas, vous n'avez pas modifié l'association par fichier sur le fichier source, vous devez donc procéder, puis réexécuter la commande DeRez.

Une fois que vous avez cela, vous pouvez le pousser dans un autre fichier comme suit (en supposant que bar.txt existe):

Rez foo.r -a -o bar.txt

Cela met à jour bar.txt en place avec la fourchette de ressources de foo.r.

Pour vérifier que cela a bien fonctionné, puisque ni Rez ni DeRez n'impriment de messages d'erreur, faites simplement ceci:

DeRez bar.txt

Vous devriez voir les mêmes informations qu'auparavant. Après tout cela, ouvrez simplement le fichier bar.txt comme vous le feriez normalement, et il devrait s'ouvrir dans la bonne application, pas celle par défaut.

Pour effectuer un changement de lot, une fois que vous avez le fichier .r, vous pouvez utiliser une extension générique standard comme celle-ci:

Rez foo.r -a -o *.txt

Cela fera tous les fichiers qui correspondent au caractère générique.

J'ai fait cela sur 10.7, mais je crois comprendre que cela fonctionne aussi sur les machines antérieures.

mauvedeity
la source
Informations intéressantes sur ces outils. Pourtant, il semble que ces outils ne font rien que l'accès ..namedfork/rsrcne fasse pas non plus, n'est-ce pas? Vous échangez nécessitant des connaissances sur les (semi) internes pour des connaissances sur des outils spécifiques - je ne suis pas convaincu que ce soit mieux.
Daniel Beck
@DanielBeck Vous avez raison, pour autant que je sache. Cependant, comme cela a été dit en amont, les informations internes ont changé avec Lion, alors qu'il s'agit d'outils de développement stables qui devraient être indépendants de la version. Personnellement, je pense que les éléments internes sont intéressants, mais les outils sont plus susceptibles de fonctionner sur plusieurs plates-formes, et je préfère utiliser les outils pris en charge.
mauvedeity
3

Je l'ai fait en utilisant xattr (cela fonctionne parfaitement sur le volume APFS)

xattr -wx com.apple.LaunchServices.OpenWith \
"`xattr -px com.apple.LaunchServices.OpenWith FILEWITHGOODTYPE`" FILETOCHANGE

Voir ce sujet si vous en avez besoin de plus

père Noël
la source
1

Vous dites que vous voulez "changer par lots" l'application associée à un (sous-) ensemble de fichiers donné, d'un type donné. sous-ensemble, car vous ne voulez pas remplacer toutes les instances de ce type de fichier par cette nouvelle application.

Cependant, il n'y a aucun moyen facile de le faire. La façon dont LaunchServices découvre quelle application doit être invitée à ouvrir un fichier est un processus en plusieurs étapes et dépend de paramètres avec des étendues différentes (utilisateur, système, etc.).

Mais - vous pouvez utiliser opensur la ligne de commande et lui dire d'utiliser une application spécifique cette fois. Cela ne changerait aucune association, mais cela permettrait d'atteindre ce que vous dites vouloir, à savoir ouvrir un ensemble de fichiers dans une application spécifique:

open -a <appbundle> <somefile> <anotherfile>

comme

shiny:t fl$ ls -l
total 1848
-rwxr-xr-x  1 fl  staff    1795 Mar 18 20:03 distribution.pl
-rw-r--r--  1 fl  staff  939264 Mar 18 20:03 objectreport.txt
shiny:t fl$ open -a TextWrangler distribution.pl objectreport.txt

et, en s'éloignant totalement de la ligne de commande: jetez un œil à cet utilitaire: http://michelf.com/software/magic-launch/

Florenz Kley
la source
Dans votre exemple spécifique, ce open -a TextWrangler *serait encore plus rapide.
Daniel Beck
oui, mais cela ajouterait la couche d'expansion du shell aux caractères génériques à l'explication, ce qui rendrait l'exemple moins compréhensible :-) pas si mal pour ouvrir, mais il existe d'autres outils qui invitent simplement à des problèmes de caractères génériques ...
Florenz Kley