Mac OSX modifica l'associazione dei file per file sulla riga di comando


10

Devo modificare in batch l'applicazione associata a determinati file tramite la riga di comando. Non devo cambiare l'associazione dei file per una determinata estensione, in realtà sto cercando di targetizzare file specifici da aprire in un'applicazione diversa rispetto all'associazione predefinita per quel tipo di file. Non voglio modificare l'applicazione predefinita per questa estensione di file in generale, solo per i file specifici che scelgo come destinazione.

In questo momento, sto selezionando tutti i file che voglio cambiare nel finder, premendo l'opzione + comando + i per aprire ottenere informazioni per più file e la modifica dell'applicazione per quei file. È un po 'fastidioso.

Risposte:


6

Queste informazioni sono memorizzate nel fork delle risorse del file ( Wikipedia ). Queste fork di risorse sono esposte come attributi estesi ( 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 

La modifica da zero è probabilmente piuttosto dolorosa - molti dati binari:

$ 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

Ma puoi trattare queste fork di risorse come file. Per esempio:

$ 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 è il modo in cui il fork delle risorse è esposto alle applicazioni POSIX (cioè probabilmente tutto ciò che fai nel Terminale).

Quindi è sufficiente creare un file "modello" da un fork di risorse esistente (in questo esempio openInSublime2rsrc) e successivamente è possibile copiarlo negli altri file.


1
Questa soluzione ha funzionato fino a Lion. La copia nel file / rsrc mi dà un errore ": Not a directory". Torna al punto di partenza :(
Rob

1
@Rob Prova a usare somefile.txt/..namedfork/rsrcinvece. somefile.txt/rsrcè stato deprecato qualche tempo fa.
Daniel Beck

Daniel Beck, sei un vero toccasana, grazie mille.
Rob,

Non è necessario modificare le forcelle delle risorse direttamente, vedere la mia risposta di seguito, ma il riepilogo è che è possibile utilizzare le utilità chiamate Rez e DeRez per modificare le forcelle delle risorse. Poiché questi sono strumenti di sviluppo supportati, è meno probabile che tu abbia un problema.
mauvedeity

5

Raccogliendo dalla risposta di Daniel Beck sopra, queste informazioni sono effettivamente memorizzate nel fork delle risorse del file. Apple fornisce due utility, chiamate "Rez" e "DeRez" con gli strumenti di sviluppo, che consentono di manipolare le fork di risorse. In particolare, puoi inserire un fork di risorse in un file con Rez.

Per modificare l'associazione di un singolo file dalla riga di comando, prima crea un file del tipo giusto e cambia manualmente la sua associazione con l'applicazione in cui vuoi aprirlo. Questo crea il fork delle risorse nel file, se non Per fare ciò, non ci saranno informazioni da copiare. Quindi, estrai il fork delle risorse con DeRez, in questo modo (presupponendo un file foo.txt e che l'applicazione che desideri utilizzare è Firefox.app).

DeRez foo.txt > foo.r

Questo creerà un file chiamato foo.r che è il fork delle risorse decompilato come file di testo. Sarà simile a questo:

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"            /* ................ */

Puoi modificarlo se vuoi crearne uno da zero, ma devi avere il formato esattamente giusto o non funzionerà. Sono solo caratteri con codifica esadecimale che descrivono il percorso del pacchetto di app desiderato, terminato con uno zero.

È possibile che venga visualizzato un messaggio in cui viene indicato che il fork delle risorse è vuoto e non inizializzato. In tal caso, non è stata modificata l'associazione per file sul file di origine, quindi è necessario farlo, quindi rieseguire il comando DeRez.

Una volta ottenuto questo, puoi inserirlo in un altro file come segue (supponendo che bar.txt esista):

Rez foo.r -a -o bar.txt

Questo aggiorna bar.txt in atto con il fork delle risorse da foo.r.

Per verificare che abbia funzionato correttamente, poiché né Rez né DeRez stampano i messaggi di errore, basta fare questo:

DeRez bar.txt

Dovresti vedere le stesse informazioni di prima. Dopo tutto ciò, basta aprire il file bar.txt come faresti normalmente e dovrebbe aprirsi nell'applicazione corretta, non in quella predefinita.

Per eseguire una modifica in batch, una volta ottenuto il file .r, è possibile utilizzare un'espansione jolly standard come questa:

Rez foo.r -a -o *.txt

Questo farà tutti i file che corrispondono al carattere jolly.

L'ho fatto su 10.7, ma ho capito che funziona anche su macchine precedenti.


Informazioni interessanti su questi strumenti. Tuttavia, sembra che questi strumenti non facciano nulla che l'accesso ..namedfork/rsrcnon faccia anche, giusto? Fai trading che richiede la conoscenza di (semi) interni per la conoscenza di strumenti specifici - non sono convinto che sia meglio.
Daniel Beck

@DanielBeck Hai ragione, per quanto ne so. Tuttavia, come è stato detto upthread, le informazioni interne sono cambiate con Lion, mentre questi sono strumenti di sviluppo stabili che dovrebbero essere indipendenti dalla versione. Personalmente, penso che le cose interne siano interessanti, ma gli strumenti hanno maggiori probabilità di funzionare su più piattaforme e preferirei utilizzare gli strumenti supportati.
mauvedeity


1

Dici di voler "cambiare in batch" l'applicazione associata a un dato (sotto-) set di file, di un determinato tipo. sub-set perché non si desidera modificare tutte le istanze di quel tipo di file in quella nuova applicazione.

Tuttavia, non esiste un modo semplice per farlo. Il modo in cui LaunchServices scopre quale applicazione dovrebbe essere aperta per aprire un file è un processo a più fasi e dipende da impostazioni con ambiti diversi (utente, sistema e così via).

Ma - puoi usare opendalla riga di comando e dirgli di usare un'app specifica questa volta. Ciò non cambierebbe alcuna associazione, ma raggiungerebbe ciò che dici di volere, ovvero aprire un set di file in un'applicazione specifica:

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

piace

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

e, allontanandoti completamente dalla riga di comando: dai un'occhiata a questa utility: http://michelf.com/software/magic-launch/


Nel tuo esempio specifico, open -a TextWrangler *sarebbe ancora più veloce.
Daniel Beck

sì, ma ciò aggiungerebbe il livello di espansione dei caratteri jolly alla spiegazione, il che renderebbe meno comprensibile l'esempio :-) non è poi così male per l'apertura, ma ci sono altri strumenti che invitano solo problemi con i caratteri jolly ...
Florenz Kley
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.