2009-07-23 14 views
6

Je suis en train d'écrire un script shell qui va rsync fichiers à partir de machines distantes, certains linux, certains macs, à un serveur de sauvegarde central. Les macs ont des dossiers au niveau racine contenant des alias de tous les fichiers/dossiers qui doivent être sauvegardés. Qu'est-ce qu'une commande de terminal que je peux utiliser pour résoudre le chemin vers les fichiers/dossiers vers lesquels les alias pointent? (Je vais devoir passer ces chemins à rsync)Commande de terminal OS X pour résoudre le chemin d'un alias

Répondre

3

Je trouve le script suivant qui fait ce que je avais besoin:

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

Ceci est correct tant que l'élément d'origine est accessible au moment de l'exécution du script. Cela ne fonctionne pas si l'alias est cassé ou si le volume ne peut pas être monté. J'ai ajouté un lien vers un outil qui peut fonctionner dans ces circonstances dans une autre réponse http://stackoverflow.com/a/17570232/425078 – rptb1

+0

pourquoi toute la copie et la restauration existante fd 2? pourquoi ne pas simplement dire 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim

+0

@dubiousjim qui serait plus propre. Je n'ai pas écrit ce script; Je l'ai trouvé en ligne. Cela étant dit, je vais tester votre suggestion et mettre à jour la réponse – Josh

3

J'ai trouvé this tool.

Un petit peu de code compilé, une fonction dans votre .bash_profile, et le tour est joué. Gestion transparente des alias, utilisez simplement "cd". Plusieurs fois plus rapide que l'utilisation d'Applescript, aussi.

+0

La partie utile de votre lien (cet outil): 'getTrueName.c' n'est plus disponible à partir de là. –

+1

@danielAzuelos merci de me le faire savoir! J'ai tweeté à l'auteur, le lien est fixe. – Groxx

7

J'ai eu ce problème et j'ai donc implémenté un outil de ligne de commande. Il est open source à https://github.com/rptb1/aliasPath

L'élément clé est que cela fonctionnera même si l'alias est cassé, contrairement à toute solution AppleScript que j'ai trouvé. Vous pouvez donc l'utiliser pour écrire des scripts pour corriger des alias lorsque beaucoup de fichiers changent de volume. C'est pourquoi je l'ai écrit.

Le code source est très court, mais voici un résumé de la partie clé, pour toute personne ayant besoin de résoudre ce problème dans le code, ou qui veut consulter les protocoles pertinents.

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