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


17

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

Ответы:


10

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

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

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

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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.