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 aliases of all files/folders which need to be backed up. What is a terminal command I can use to resolve the path to the files/folders the aliases point to? (I'll need to pass these paths to rsync)
A:
Aliases are symlinks, right? (never know if apple invented their own wheel)
If rsync doesn't have a switch to follow the links itself, you can use this function. It will print final tagret of a symlink regardless of how many levels of redirection are there.
function resolve_symlink()
{
local dir="$1"
local final_path=""
while true
do
if [[ -h "${dir}" ]]
then
dir="$(ls -l "${dir}" | sed "s#^.*-> ##")"
else
echo "${dir}"
break
fi
done
}
resolve_symlink "/path/to/symlink"
Eugene
2009-07-24 00:28:04
Assuming Josh is really talking about aliases, and not using "alias" as a synonym for "symlink" (as some people do), then no, aliases _aren't_ symlinks. HFS+ does support symlinks, and the Finder displays symlinks in the same way as aliases, but they're not the same thing.
mipadi
2009-07-24 00:44:29
@mipadi is correct -- aliases are specific to Mac OS X and are sadly not the same as symlinks.
Josh
2009-07-24 12:08:53
The `file` command can tell you where a symlink goes. Maybe it also works on aliases.
jleedev
2009-08-10 20:15:55
Groxx
2010-06-07 19:41:57
+1
A:
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
Josh
2009-08-25 19:13:24
+2
A:
Though I realize how late this is, for future reference I've found this:
http://www.warrenmoore.net/blog/2010/01/09/make-terminal-follow-aliases-like-symlinks/
A tiny bit of compiled code, a function in your .bash_profile, and viola. Transparent handling of aliases, just use "cd". Several times faster than using Applescript, too.
Groxx
2010-03-08 00:55:54