代码之家  ›  专栏  ›  技术社区  ›  Josh Andreas Rehm

用于解析别名路径的OS X终端命令

  •  6
  • Josh Andreas Rehm  · 技术社区  · 15 年前

    我正在编写一个shell脚本,它将远程机器、一些Linux、一些Mac上的文件同步到中央备份服务器。Mac的根级别上有文件夹,其中包含所有需要备份的文件/文件夹的别名。我可以使用什么终端命令来解析别名指向的文件/文件夹的路径?(我需要将这些路径传递给rsync)

    3 回复  |  直到 9 年前
        1
  •  7
  •   rptb1    11 年前

    我遇到了这个问题,所以我实现了一个命令行工具。它是开源的 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];
    
        2
  •  3
  •   Josh Andreas Rehm    15 年前

    我发现下面的脚本可以满足我的需要:

    #!/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
    
        3
  •  3
  •   dan    9 年前

    我找到了 this tool .

    一小段编译代码,一个函数 .bash_profile 和VoILA。透明处理别名,只需使用“cd”。比使用applescript快几倍。