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
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
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.
La parte utile del tuo link (questo strumento): 'getTrueName.c' non è più disponibile da lì. –
@danielAzuelos grazie per avermelo fatto sapere! Ho twittato l'autore, il collegamento è stato risolto. – Groxx
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];
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
perché tutte le operazioni di copia e ripristino di fd 2 esistenti? perché non dire semplicemente 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim
@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