Чи можу я створити ярлик на робочому столі / псевдонім до папки з терміналу?


17

Я хотів би створити ярлик робочого столу до певної папки, похований глибоко всередині ~/Library/. Бібліотека за замовчуванням в Леві прихована, і я хотів би зберегти її таким чином з різних причин. Чи можна скористатися однокроковим командним рядком для створення ярлика робочого столу до заданого шляху? Я хотів би уникати рішень, які передбачають розкриття Бібліотеки, створення псевдоніму за допомогою 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"спрацює, чи потрібно чітко включати ім'я користувача в команду Terminal?
LessPop_MoreFizz

Я просто спробував використовувати, ~і це не працює з однорядковою osascriptкомандою. Я пропоную замість цього використовувати сценарій, оскільки ~перетворюється автоматично.
Келвін

Хм. Здається, розбиваємось на імена файлів з пробілами, такими як/Library/Application Support/
LessPop_MoreFizz

Якщо ви використовуєте скрипт bash, вам слід ввести ім'я файлу в одинарні лапки, якщо в ньому є пробіли або спеціальні символи. Однак це не дозволить ~розширитись. Найкраще не використовувати лапки, а на вкладці завершити ім'я файлу, щоб bash правильно "уникнути" спеціальних символів. Наприклад, наберіть ~/Library/Applicationвкладку. Якщо це 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.