2009-07-23 14 views
6

Estoy escribiendo un script de shell que sincronizará archivos desde máquinas remotas, algunos Linux, algunos Mac, a un servidor central de respaldo. Los Mac tienen carpetas en el nivel raíz que contienen alias de todos los archivos/carpetas de los que se necesita hacer una copia de seguridad. ¿Qué es un comando de terminal que puedo usar para resolver la ruta a los archivos/carpetas a los que apuntan los alias? (Voy a tener que pasar estos caminos para rsync)Comando de terminal OS X para resolver la ruta de un alias

Respuesta

3

He encontrado el siguiente script que hace lo que necesitaba:

#!/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

Esto está bien siempre que se pueda acceder al elemento original en el momento en que se ejecuta el script. No funciona si el alias está roto o el volumen no se puede montar. He agregado un enlace a una herramienta que puede funcionar en esas circunstancias en otra respuesta http://stackoverflow.com/a/17570232/425078 – rptb1

+0

¿por qué toda la copia y restauración de fd 2 existente? ¿por qué no simplemente decir 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim

+0

@dubiousjim que sería más limpio. No escribí este script; Lo encontré en línea. Una vez dicho esto, probaré su sugerencia y actualizaré la respuesta – Josh

3

que he encontrado this tool.

Un pequeño código compilado, una función en su .bash_profile, y listo. Manejo transparente de alias, solo use "cd". Varias veces más rápido que usar Applescript, también.

+0

La parte útil de su enlace (esta herramienta): 'getTrueName.c' ya no está disponible desde allí. –

+1

@danielAzuelos ¡gracias por avisarme! Tuiteé al autor, el enlace es fijo. – Groxx

7

Tuve este problema y he implementado una herramienta de línea de comandos. Es de código abierto en https://github.com/rptb1/aliasPath

La clave es que funcionará incluso si el alias está roto, a diferencia de cualquier solución de AppleScript que he encontrado. Por lo tanto, puede usarlo para escribir scripts para corregir alias cuando muchos archivos cambian de volumen. Es por eso que lo escribí.

El código fuente es muy corto, pero aquí hay un resumen de la parte clave, para cualquier persona que necesite resolver este problema en el código, o que quiera buscar los protocolos relevantes.

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]; 
Cuestiones relacionadas