2009-07-23 1 views
6

Я пишу сценарий оболочки, который будет rsync-файлы с удаленных компьютеров, некоторые Linux, некоторые маки, на центральный сервер резервного копирования. Маки имеют папки на корневом уровне, содержащие псевдонимы всех файлов/папок, которые необходимо скопировать. Что такое команда терминала, которую я могу использовать для разрешения пути к файлам/папкам, на которые указывают псевдонимы? (Мне нужно пройти эти пути к Rsync)Команда терминала OS X для разрешения пути псевдонима

ответ

3

Я нашел следующий скрипт, который делает то, что мне было нужно:

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

Это нормально, пока исходный элемент может быть доступен во время запуска сценария. Это не работает, если псевдоним сломан или громкость не может быть установлена. Я добавил ссылку на инструмент, который может работать в этих обстоятельствах в другом ответе http://stackoverflow.com/a/17570232/425078 – rptb1

+0

Почему все копирование и восстановление существующего fd 2? почему бы просто не сказать 'path = $ (osascript 2>/dev/null << EOF ...)' – dubiousjim

+0

@dubiousjim, который был бы чище. Я не писал этот сценарий; Я нашел его онлайн. При этом я буду проверять ваше предложение и обновлять ответ – Josh

3

Я нашел this tool.

Маленький бит скомпилированного кода, функция в вашем .bash_profile и вуаля. Прозрачная обработка псевдонимов, просто используйте «cd». В несколько раз быстрее, чем использование Applescript.

+0

Полезная часть вашей ссылки (этот инструмент): 'getTrueName.c' больше не существует. –

+1

@danielAzuelos благодарит за то, что дайте мне знать! Я написал в твиттере у автора, ссылка исправлена. – Groxx

7

У меня была эта проблема, поэтому я применил инструмент командной строки. Он с открытым исходным кодом находится в https://github.com/rptb1/aliasPath

Главное, чтобы он работал, даже если сломанный псевдоним сломан, в отличие от любого найденного AppleScript решения. Поэтому вы можете использовать его для написания скриптов для исправления псевдонимов, когда много файлов изменяет громкость. Вот почему я это написал.

Исходный код очень короткий, но вот краткое изложение ключевой части, для тех, кому еще нужно решить эту проблему в коде или кто хочет найти соответствующие протоколы.

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