2009-07-23 18 views
6

Ich schreibe ein Shell-Skript, das Rsync-Dateien von Remote-Maschinen, einige Linux, einige Macs, zu einem zentralen Backup-Server. Die Macs haben Ordner auf der Stammebene, die Aliase aller Dateien/Ordner enthalten, die gesichert werden müssen. Was ist ein Terminalkommando, mit dem ich den Pfad zu den Dateien/Ordnern auflösen kann, auf die die Aliase zeigen? (Ich werde diese Pfade zu rsync passieren müssen)OS X Terminal-Befehl zum Auflösen Pfad eines Alias ​​

Antwort

3

fand ich das folgende Skript, das tut, was ich brauchte:

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

Dies ist in Ordnung, solange auf das ursprüngliche Element zum Zeitpunkt der Ausführung des Skripts zugegriffen werden kann. Es funktioniert nicht, wenn der Alias ​​beschädigt ist oder das Volume nicht bereitgestellt werden kann. Ich habe einen Link zu einem Tool hinzugefügt, das unter diesen Umständen in einer anderen Antwort funktionieren kann http://StackOverflow.com/a/17570232/425078 – rptb1

+0

Warum alle das Kopieren und Wiederherstellen von vorhandenen FD 2? Warum sagst du nicht einfach 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim

+0

@dubiousjim, das wäre sauberer. Ich habe dieses Skript nicht geschrieben; Ich habe es online gefunden. Nachdem das gesagt ist, werde ich Ihren Vorschlag testen und die Antwort aktualisieren – Josh

3

ich this tool gefunden habe.

Ein kleines bisschen kompilierten Code, eine Funktion in Ihrem .bash_profile, und voila. Transparente Handhabung von Aliasen, benutze einfach "cd". Mehrmals schneller als mit Applescript.

+0

Der nützliche Teil Ihres Links (dieses Tool): 'getTrueName.c' ist von dort nicht mehr verfügbar. –

+1

@danielAzuelos Danke, dass Sie mich wissen lassen! Ich habe den Autor getwittert, der Link ist behoben. – Groxx

7

Ich hatte dieses Problem und so habe ich ein Befehlszeilentool implementiert. Es ist Open Source unter https://github.com/rptb1/aliasPath

Der Schlüssel ist, dass es funktioniert, auch wenn der Alias ​​gebrochen ist, im Gegensatz zu jeder AppleScript-Lösung, die ich gefunden habe. Sie können damit Skripte zum Reparieren von Aliasen verwenden, wenn viele Dateien das Volumen ändern. Deshalb habe ich es geschrieben.

Der Quellcode ist sehr kurz, aber hier ist eine Zusammenfassung des Schlüsselteils, für alle anderen, die dieses Problem im Code lösen müssen oder die relevanten Protokolle nachschlagen wollen.

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