2009-07-23 13 views
6

Sto scrivendo uno script di shell che eseguirà il rsync dei file da macchine remote, alcuni linux, alcuni mac, ad un server di backup centrale. I mac hanno cartelle al livello principale contenenti alias di tutti i file/cartelle di cui è necessario eseguire il backup. Che cosa è un comando da terminale che posso usare per risolvere il percorso verso i file/cartelle a cui puntano gli alias? (Ho bisogno di passare questi percorsi per rsync)Comando del terminale OS X per risolvere il percorso di un alias

risposta

3

ho trovato il seguente script che fa quello che mi serviva:

#!/bin/sh 
if [ $# -eq 0 ]; then 
    echo "" 
    echo "Usage: $0 alias" 
    echo " where alias is an alias file." 
    echo " Returns the file path to the original file referenced by a" 
    echo " Mac OS X GUI alias. Use it to execute commands on the" 
    echo " referenced file. For example, if aliasd is an alias of" 
    echo " a directory, entering" 
    echo ' % cd `apath aliasd`' 
    echo " at the command line prompt would change the working directory" 
    echo " to the original directory." 
    echo "" 
fi 
if [ -f "$1" -a ! -L "$1" ]; then 
    # Redirect stderr to dev null to suppress OSA environment errors 
    exec 6>&2 # Link file descriptor 6 with stderr so we can restore stderr later 
    exec 2>/dev/null # stderr replaced by /dev/null 
    path=$(osascript << EOF 
tell application "Finder" 
set theItem to (POSIX file "${1}") as alias 
if the kind of theItem is "alias" then 
get the posix path of ((original item of theItem) as text) 
end if 
end tell 
EOF 
) 
    exec 2>&6 6>&-  # Restore stderr and close file descriptor #6. 

    echo "$path" 
fi 
+0

Questo va bene fintanto che è possibile accedere all'elemento originale al momento dell'esecuzione dello script. Non funziona se l'alias è rotto o il volume non può essere montato. Ho aggiunto il collegamento a uno strumento che può funzionare in tali circostanze in un'altra risposta http://stackoverflow.com/a/17570232/425078 – rptb1

+0

perché tutte le operazioni di copia e ripristino di fd 2 esistenti? perché non dire semplicemente 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim

+0

@dubiousjim che sarebbe più pulito. Non ho scritto questo script; L'ho trovato online. Detto questo, metterò alla prova il tuo suggerimento e aggiornerò la risposta – Josh

3

ho trovato this tool.

Un piccolo bit di codice compilato, una funzione nel tuo .bash_profile e voilà. Gestione trasparente degli alias, basta usare "cd". Molto più veloce rispetto all'utilizzo di Applescript.

+0

La parte utile del tuo link (questo strumento): 'getTrueName.c' non è più disponibile da lì. –

+1

@danielAzuelos grazie per avermelo fatto sapere! Ho twittato l'autore, il collegamento è stato risolto. – Groxx

7

Ho avuto questo problema e quindi ho implementato uno strumento da riga di comando. È open source al https://github.com/rptb1/aliasPath

La cosa fondamentale è che funzionerà anche se l'alias è rotto, a differenza di qualsiasi soluzione AppleScript che ho trovato. Puoi quindi usarlo per scrivere script per correggere gli alias quando molti file cambiano volume. Ecco perché l'ho scritto.

Il codice sorgente è molto breve, ma ecco un riepilogo della parte chiave, per chiunque altro debba risolvere questo problema nel codice, o chi vuole cercare i protocolli rilevanti.

NSString *aliasPath = [NSString stringWithUTF8String:posixPathToAlias]; 
NSURL *aliasURL = [NSURL fileURLWithPath:aliasPath]; 
NSError *error; 
NSData *bookmarkData = [NSURL bookmarkDataWithContentsOfURL:aliasURL error:&error]; 
NSDictionary *values = [NSURL resourceValuesForKeys:@[NSURLPathKey] 
            fromBookmarkData:bookmarkData]; 
NSString *path = [values objectForKey:NSURLPathKey]; 
const char *s = [path UTF8String]; 
Problemi correlati