Bisakah saya membuat Desktop Shortcut / Alias ​​ke Folder dari Terminal?

17

Saya ingin membuat pintasan desktop ke folder tertentu, terkubur dalam-dalam ~/Library/. Library Hidden secara default di Lion, dan saya ingin tetap seperti itu, karena berbagai alasan. Apakah ada satu langkah, tindakan baris perintah yang bisa saya gunakan, untuk membuat pintasan desktop ke jalur yang diberikan? Saya ingin menghindari solusi yang melibatkan menyembunyikan Perpustakaan, membuat Alias ​​menggunakan Finder, dan menyembunyikannya. Saya tahu bagaimana melakukan itu, tetapi untuk tujuan saya, satu baris yang dapat disisipkan ke Terminal dan dilakukan dengan itu akan lebih baik.

LessPop_MoreFizz
sumber

Jawaban:

10

Coba ini di Terminal:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Boj
sumber
5
Saya pikir Anda maksud ln -s ~/Library/path/to/folder folder. Salah satu kelemahan kecil dari metode ini (mis. Symlinking) adalah bahwa tautan tersebut akan rusak jika "asli" (yaitu target) dipindahkan atau diganti namanya.
Kelvin
2
Argumen kedua foldertidak diperlukan. Jika Anda menghilangkannya, lnbuat tautan dengan nama yang sama dengan folder aslinya.
Boj
Ah kamu benar Saya mendapat kesalahan sebelumnya, tapi saya pasti salah ketik.
Kelvin
1
Saya tahu apa itu - Anda tidak dapat memiliki garis miring!
Kelvin
12
Alias ​​OSX bukan tautan simbolis. Lihat stackoverflow.com/questions/11165799/...
bfontaine
13

Dimungkinkan untuk melakukannya dalam satu baris Terminal. Katakanlah Anda ingin alias ke file "/ Pengguna /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'

Anda harus mengganti to filedengan to folderjika Anda memiliki folder.

Berikut skrip shell yang memungkinkan Anda meneruskan path file atau folder untuk membuat alias:

#!/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

Jika Anda memberi nama skrip ini make-alias.sh, chmod u+x make-alias.shdan memasukkannya /usr/local/bin, Anda dapat menjalankan mis make-alias.sh ~/Library/Preferences.

Kelvin
sumber
Apakah akan ~/Library/Preferences/org.herf.Flux.plist"berfungsi, atau apakah nama pengguna harus secara eksplisit dimasukkan dalam perintah Terminal?
LessPop_MoreFizz
Saya baru saja mencoba menggunakan ~dan tidak berfungsi dengan perintah satu baris osascript. Saya sarankan menggunakan file skrip sebagai gantinya, karena ~dikonversi secara otomatis.
Kelvin
Hmm. Tampaknya mematahkan nama file dengan spasi seperti/Library/Application Support/
LessPop_MoreFizz
Jika Anda menggunakan skrip bash, Anda harus meletakkan nama file dalam tanda kutip tunggal jika memiliki spasi atau karakter khusus. Namun, ini akan mencegah ~perluasan. Yang terbaik adalah tidak menggunakan tanda kutip, dan untuk melengkapi nama file sehingga bash akan "lolos" dari karakter khusus dengan benar. Misalnya ketik ~/Library/Applicationlalu tekan tab. Jika Application Supporthanya cocok, shell harus memasukkan backslash sebelum spasi. Anda juga dapat menggunakan backslash secara manual untuk melarikan diri.
Kelvin
Perhatikan bahwa masalah spasi / karakter khusus akan ada dalam solusi apa pun - shell tidak dapat mengetahui bahwa Anda bermaksud untuk melewati 1 parameter daripada 2 yang terpisah.
Kelvin
1

Jika Anda perlu menargetkan tautan pada folder tertentu (atau berikan nama tertentu), Anda dapat menggunakannya set name of result to "…"seperti pada

#!/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
sumber
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
Andrew McClure
sumber
Penjelasan tentang bagaimana skrip bekerja akan berguna
user151019
Sama seperti skrip di atas tetapi tanpa perlu jalan pintas
Andrew McClure
0

Untuk orang-orang yang menginginkan solusi python, berikut adalah fungsi membungkus applescript, lalu memanggil 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)
Jerry T
sumber