Можно ли создать ярлык на рабочем столе / псевдоним для папки из терминала?

17

Я хотел бы создать ярлык на рабочем столе для конкретной папки, скрытой глубоко внутри ~/Library/. Библиотека по умолчанию скрыта в Lion, и я бы хотел сохранить ее по разным причинам. Есть ли одношаговое действие командной строки, которое я могу использовать, чтобы создать ярлык на рабочем столе для указанного пути? Я бы хотел избежать решений, которые включают в себя отображение библиотеки, создание псевдонима с помощью Finder и повторное его скрытие. Я знаю, как это сделать, но для моих целей предпочтительнее было бы вставить одну строку в терминал и покончить с ней.

LessPop_MoreFizz
источник

Ответы:

10

Попробуйте это на терминале:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Boj
источник
5
Я думаю, что вы имели в виду ln -s ~/Library/path/to/folder folder. Один небольшой недостаток этого метода (то есть символическая ссылка) заключается в том, что ссылка будет разорвана, если «оригинал» (то есть цель) будет перемещен или переименован.
Кельвин
2
Второй аргумент folderне обязателен. Если вы опустите его, lnсоздаст ссылку с именем оригинальной папки.
Boj
Ах, ты прав. У меня раньше была ошибка, но я, должно быть, что-то опечатал.
Кельвин
1
Я знаю, что это было - ты не можешь иметь косую черту!
Кельвин
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 fileс , to folderесли у вас есть папка.

Вот сценарий оболочки, который позволяет вам указать путь к файлу или папке для создания псевдонима:

#!/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.sh, chmod u+x make-alias.shи поместить его в /usr/local/bin, вы можете запустить , например make-alias.sh ~/Library/Preferences.

кельвин
источник
Будет ~/Library/Preferences/org.herf.Flux.plist"работать, или имя пользователя должно быть явно включено в команду терминала?
LessPop_MoreFizz
Я только что попытался использовать, ~и он не работает с однострочной osascriptкомандой. Вместо этого я предлагаю использовать файл сценария, потому что ~он конвертируется автоматически.
Кельвин
Хм. Кажется, ломаются имена файлов с такими пробелами, как/Library/Application Support/
LessPop_MoreFizz
Если вы используете скрипт bash, вы должны поместить имя файла в одинарные кавычки, если в нем есть пробелы или специальные символы. Тем не менее, это будет препятствовать ~расширению. Лучше всего не использовать кавычки, а завершить табуляцию именем файла, чтобы bash правильно «экранировал» специальные символы. Например, введите, ~/Library/Applicationзатем нажмите Tab. Если Application Supportсовпадение было единственным, оболочка должна была вставить обратную косую черту перед пробелом. Вы также можете вручную использовать обратную косую черту для выхода.
Кельвин
Обратите внимание, что проблема с пробелами / специальными символами существует в любом решении - оболочка не может знать, что вы хотели передать 1 параметр, а не 2 отдельных.
Кельвин
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
Mapio
источник
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
То же, что и сценарий выше, но без необходимости в реальном пути
Эндрю МакКлюр
0

Для людей, которые хотели бы получить решение на Python, здесь есть функция, которая оборачивает яблочный скрипт, а затем вызывает 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)
Джерри Т
источник