Posso creare un collegamento / alias desktop in una cartella dal terminale?


17

Vorrei creare un collegamento sul desktop in una cartella specifica, sepolto nel profondo ~/Library/. La libreria è nascosta per impostazione predefinita in Lion e mi piacerebbe mantenerla così, per una serie di motivi. Esiste un'azione da riga di comando in un solo passaggio che posso utilizzare per creare un collegamento sul desktop a un determinato percorso? Vorrei evitare soluzioni che implicano lo svelamento della Biblioteca, la creazione dell'Alias ​​tramite Finder e il suo nascondimento. So come farlo, ma per i miei scopi, sarebbe preferibile una singola linea che può essere incollata nel Terminale e con cui fare ciò.

Risposte:


10

Prova questo sul Terminale:

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

5
Penso che volevi dire ln -s ~/Library/path/to/folder folder. Uno svantaggio minore di questo metodo (ad es. Collegamento simbolico) è che il collegamento verrà interrotto se lo "originale" (ovvero la destinazione) viene spostato o rinominato.
— Kelvin,

2
Il secondo argomento foldernon è richiesto. Se lo ometti, lncrea un collegamento con lo stesso nome della cartella originale.
— Boj,

Ah, hai ragione. Ho ricevuto un errore prima, ma devo aver sbagliato a digitare qualcosa.
— Kelvin,

1
So cos'era - non puoi avere una barra finale!
— Kelvin,

12
Gli alias OSX non sono collegamenti simbolici. Vedere stackoverflow.com/questions/11165799/...
— bfontaine

13

È possibile farlo in una riga del terminale. Diciamo che vuoi alias al file "/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'

È necessario sostituire to filecon to folderse si dispone di una cartella.

Ecco uno script di shell che ti consente di passare un percorso di file o cartella per creare l'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

Se è il nome di questo script make-alias.sh, chmod u+x make-alias.she metterlo in /usr/local/bin, è possibile eseguire ad es make-alias.sh ~/Library/Preferences.


Funzionerà ~/Library/Preferences/org.herf.Flux.plist"o il nome utente deve essere esplicitamente incluso nel comando Terminale?
— LessPop_MoreFizz,

Ho appena provato a utilizzare ~e non funziona con il osascriptcomando di una riga . Suggerisco invece di utilizzare il file di script, poiché ~viene convertito automaticamente.
— Kelvin,

Hmm. Sembra spezzare i nomi dei file con spazi come/Library/Application Support/
— LessPop_MoreFizz

Se stai usando lo script bash, dovresti mettere il nome del file tra virgolette singole se ha spazi o caratteri speciali. Tuttavia, ciò impedirà ~l'espansione. La cosa migliore è non usare le virgolette e fare un tab per completare il nome del file in modo che bash "sfugga" correttamente ai caratteri speciali. Ad esempio digitare ~/Library/Applicationquindi premere tab. Se Application Supportfosse l'unica corrispondenza, la shell avrebbe dovuto inserire una barra rovesciata prima dello spazio. Puoi anche usare manualmente una barra rovesciata per uscire.
— Kelvin,

Si noti che il problema spazi / caratteri speciali esisterebbe in qualsiasi soluzione: la shell non può sapere che intendevi passare 1 parametro anziché 2 separati.
— Kelvin,

1

Nel caso in cui sia necessario indirizzare il collegamento a una cartella specifica (o assegnargli un nome specifico), è possibile utilizzare set name of result to "…"come in

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

Una spiegazione di come funziona lo script sarebbe utile
— user151019

Lo stesso della sceneggiatura sopra, ma senza bisogno di realpath
— Andrew McClure,

0

Per le persone che desiderano una soluzione Python, ecco una funzione che avvolge applecript, quindi chiama 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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.