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.