Команда терминала OS X для разрешения пути псевдонима

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


person Josh    schedule 23.07.2009    source источник


Ответы (3)


У меня была эта проблема, и поэтому я реализовал инструмент командной строки. Это с открытым исходным кодом по адресу 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];
person rptb1    schedule 10.07.2013

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

#!/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
person Josh    schedule 25.08.2009
comment
Это нормально, если исходный элемент доступен во время запуска скрипта. Это не работает, если псевдоним сломан или том не может быть смонтирован. Я добавил ссылку на инструмент, который может работать в этих обстоятельствах, в другом ответе stackoverflow.com/a/17570232/425078 - person rptb1; 10.07.2013
comment
зачем все копировать и восстанавливать существующие фд 2? почему бы просто не сказать path=$(osascript 2>/dev/null << EOF ...) - person dubiousjim; 31.08.2015
comment
@dubiousjim это было бы чище. Я не писал этот сценарий; Я нашел это онлайн. При этом я проверю ваше предложение и обновлю ответ. - person Josh; 01.09.2015
comment
@ Джош, если сценарий не является твоей собственной работой, то ты должен хотя бы указать ссылку на то, где ты его нашел. - person ; 09.05.2016