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
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
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.
La partie utile de votre lien (cet outil): 'getTrueName.c' n'est plus disponible à partir de là. –
@danielAzuelos merci de me le faire savoir! J'ai tweeté à l'auteur, le lien est fixe. – Groxx
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];
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
pourquoi toute la copie et la restauration existante fd 2? pourquoi ne pas simplement dire 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim
@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