我可以从终端创建桌面快捷方式/别名到文件夹吗?


17

我想为特定文件夹创建桌面快捷方式,该快捷方式埋在内~/Library/。Lion默认情况下将“图书馆”隐藏,出于各种原因,我想保持这种状态。我可以使用一个一步的命令行操作来创建到给定路径的桌面快捷方式吗?我想避免涉及取消隐藏库,使用Finder创建Alias以及隐藏它的解决方案。我知道该怎么做,但出于我的目的,最好将一行粘贴到Terminal中并完成。

Answers:


10

在终端上尝试:

cd ~/Desktop
ln -s ~/Library/path/to/folder

5
我想你的意思是ln -s ~/Library/path/to/folder folder。此方法(即符号链接)的一个次要缺点是,如果“原始”(即目标)被移动或重命名,则链接将断开。
开尔文2012年

2
第二个参数folder不是必需的。如果您省略它,则ln创建一个与原始文件夹名称相同的链接。
Boj 2012年

啊,你是对的。之前我遇到了一个错误,但是我一定打错了一些内容。
开尔文(Kelvin)2012年

1
我知道那是什么-您不能在斜线后面加上斜线!
开尔文(Kelvin)2012年

12
OSX别名不是符号链接。见stackoverflow.com/questions/11165799/...
bfontaine

13

可以在终端的一行中完成此操作。假设您要别名文件“ /Users/me/Library/Preferences/org.herf.Flux.plist”。

osascript -e 'tell application "Finder"' -e 'make new alias to file (posix file "/Users/me/Library/Preferences/org.herf.Flux.plist") at desktop' -e 'end tell'

如果您有文件夹,则应替换to fileto folder

这是一个shell脚本,它允许您传递文件或文件夹路径来创建别名:

#!/bin/bash

if [[ -f "$1" ]]; then
  type="file"
else
  if [[ -d "$1" ]]; then 
    type="folder"
  else
    echo "Invalid path or unsupported type"
    exit 1
  fi
fi

osascript <<END_SCRIPT
tell application "Finder"
   make new alias to $type (posix file "$1") at desktop
end tell
END_SCRIPT

如果你的名字这个脚本make-alias.shchmod u+x make-alias.sh并把它/usr/local/bin,你可以运行如make-alias.sh ~/Library/Preferences


~/Library/Preferences/org.herf.Flux.plist"工作,还是用户名需要被明确列入终端命令?
LessPop_MoreFizz 2012年

我只是尝试使用~,但不适用于单行osascript命令。我建议改用脚本文件,因为~会自动转换。
开尔文2012年

嗯 似乎在文件名上/Library/Application Support/
打乱

如果使用的是bash脚本,则如果文件名包含空格或特殊字符,则应将其放在单引号中。但是,这将阻止~扩展。最好不要使用引号,并使用制表符完成文件名,以便bash可以正确地“转义”特殊字符。例如,~/Library/Application然后按Tab键。如果Application Support是唯一的匹配项,则外壳程序应该在空格之前插入反斜杠。您也可以手动使用反斜杠进行转义。
开尔文2012年

请注意,在任何解决方案中都将存在空格/特殊字符问题-Shell无法知道您要传递1个参数而不是2个单独的参数。
开尔文(Kelvin)2012年

1

如果你需要为目标,在一个特定的文件夹中的链接(或给它一个特定的名字),你可以使用set name of result to "…"

#!/bin/bash

if [[ $# -ne 2 ]]; then
    echo "mkalias: specify 'from' and 'to' paths" >&2
    exit 1
fi

from="$(realpath $1)"
todir="$(dirname $(realpath $2))"
toname="$(basename $(realpath $2))"
if [[ -f "$from" ]]; then
    type="file"
elif [[ -d "$from" ]]; then
    type="folder"
else
    echo "mkalias: invalid path or unsupported type: '$from'" >&2
    exit 1
fi

osascript <<EOF
tell application "Finder"
   make new alias to $type (posix file "$from") at (posix file "$todir")
   set name of result to "$toname"
end tell
EOF

1
#!/bin/bash

get_abs() {
  # $1 : relative filename
  echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")"
}


if [[ $# -ne 2 ]]; then
    echo "mkalias: specify 'from' and 'to' paths" >&2
    exit 1
fi

from=$(eval get_abs $1)  
todir=$(dirname $(eval get_abs $2))
toname=$(basename $(eval get_abs $2))
if [[ -f "$from" ]]; then
    type="file"
elif [[ -d "$from" ]]; then
    type="folder"
else
    echo "mkalias: invalid path or unsupported type: '$from'" >&2
    exit 1
fi

osascript <<EOF
tell application "Finder"
   make new alias to $type (posix file "$from") at (posix file "$todir")
   set name of result to "$toname"
end tell
EOF

有关脚本如何工作的解释将非常有用
user151019 '18

与上面的脚本相同,但不需要realpath
Andrew McClure

0

对于想要python解决方案的人,这是一个包装applescript的函数,然后调用subprocess.call:

def applescript_finder_alias(theFrom, theTo):
    """
    (theFrom, theTo)
    create a short/alias
    theFrom, theTo: relative or abs path, both folder or both file
    """
    # /apple/51709
    applescript = '''
    tell application "Finder"
       make new alias to %(theType)s (posix file "%(theFrom)s") at (posix file "%(todir)s")
       set name of result to "%(toname)s"
    end tell
    '''
    def myesp(cmdString):
        import os, inspect, tempfile, subprocess
        caller = inspect.currentframe().f_back
        cmd =  cmdString % caller.f_locals

        fd, path = tempfile.mkstemp(suffix='.applescript')
        try:
            with os.fdopen(fd, 'w') as tmp:
                tmp.write(cmd.replace('"','\"').replace("'","\'")+'\n\n')
            subprocess.call('osascript ' + path, shell=True, executable="/bin/bash")
        finally:
            os.remove(path)
        return None
    import os
    theFrom = os.path.abspath(theFrom)
    theTo = os.path.abspath(theTo)
    if os.path.isfile(theFrom): 
        theType = 'file'
    else:
        theType = 'folder'
    todir = os.path.dirname(theTo)
    toname = os.path.basename(theTo)
    myesp(applescript)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.