OS X terminal command to resolve path of an alias

前端 未结 3 1723
野性不改
野性不改 2021-02-06 08:04

I\'m writing a shell script which will rsync files from remote machines, some linux, some macs, to a central backup server. The macs have folders on the root level containing al

相关标签:
3条回答
  • 2021-02-06 08:55

    I had this problem and so I've implemented a command-line tool. It's open source at https://github.com/rptb1/aliasPath

    The key thing is that it will work even if the alias is broken, unlike any AppleScript solution I've found. You can therefore use it to write scripts to fix aliases when lots of files change volume. That's why I wrote it.

    The source code is very short, but here's a summary of the key part, for anyone else needing to solve this problem in code, or who wants to look up the relevant protocols.

    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];
    
    0 讨论(0)
  • 2021-02-06 09:07

    I found the following script which does what I needed:

    #!/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 讨论(0)
  • 2021-02-06 09:07

    I've found this tool.

    A tiny bit of compiled code, a function in your .bash_profile, and voila. Transparent handling of aliases, just use "cd". Several times faster than using Applescript, too.

    0 讨论(0)
提交回复
热议问题