Puis-je créer un raccourci de bureau / alias vers un dossier à partir du terminal?


17

Je voudrais créer un raccourci sur le bureau vers un dossier spécifique, enfoui au fond ~/Library/. La bibliothèque est masquée par défaut dans Lion, et j'aimerais que cela reste ainsi, pour diverses raisons. Existe-t-il une action en ligne de commande en une étape que je peux utiliser pour créer un raccourci de bureau vers un chemin donné? Je voudrais éviter les solutions qui impliquent d'afficher la bibliothèque, de créer l'alias à l'aide du Finder et de le masquer. Je sais comment faire cela, mais pour mes besoins, une seule ligne qui peut être collée dans Terminal et être supprimée serait préférable.

Réponses:


10

Essayez ceci sur le terminal:

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

5
Je pense que tu voulais dire ln -s ~/Library/path/to/folder folder. Un inconvénient mineur de cette méthode (ie lien symbolique) est que le lien sera rompu si "l'original" (ie la cible) est déplacé ou renommé.
Kelvin

2
Le deuxième argument foldern'est pas requis. Si vous l'omettez, lncrée un lien nommé de la même manière que le dossier d'origine.
Boj

Ah, tu as raison. J'ai eu une erreur avant, mais j'ai dû mal saisir quelque chose.
Kelvin

1
Je sais ce que c'était - vous ne pouvez pas avoir de barre oblique!
Kelvin

12
Les alias OSX ne sont pas des liens symboliques. Voir stackoverflow.com/questions/11165799/…
bfontaine

13

Il est possible de le faire sur une seule ligne de Terminal. Supposons que vous souhaitiez créer un alias pour le fichier "/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'

Vous devez remplacer to file par to foldersi vous avez un dossier.

Voici un script shell qui vous permet de passer un chemin de fichier ou de dossier pour créer 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

Si vous nommez ce script make-alias.sh, chmod u+x make-alias.shet le mettre dans /usr/local/bin, par exemple , vous pouvez exécuter make-alias.sh ~/Library/Preferences.


Cela ~/Library/Preferences/org.herf.Flux.plist"fonctionnera- t -il ou le nom d'utilisateur doit-il être explicitement inclus dans la commande Terminal?
LessPop_MoreFizz

J'ai juste essayé d'utiliser ~et cela ne fonctionne pas avec la osascriptcommande en ligne . Je suggère d'utiliser le fichier de script à la place, car le fichier ~est converti automatiquement.
Kelvin

Hmm. Semble rompre sur les noms de fichiers avec des espaces tels que/Library/Application Support/
LessPop_MoreFizz

Si vous utilisez le script bash, vous devez mettre le nom de fichier entre guillemets s'il contient des espaces ou des caractères spéciaux. Cependant, cela empêchera ~d'être étendu. La meilleure chose à faire est de ne pas utiliser de guillemets et de tabuler le nom de fichier pour que bash "échappe" correctement les caractères spéciaux. Par exemple, tapez ~/Library/Applicationpuis appuyez sur tab. Si Application Supportc'était la seule correspondance, le shell aurait dû insérer une barre oblique inverse avant l'espace. Vous pouvez également utiliser manuellement une barre oblique inverse pour vous échapper.
Kelvin

Notez que le problème des espaces / caractères spéciaux existerait dans n'importe quelle solution - le shell ne peut pas savoir que vous vouliez passer 1 paramètre plutôt que 2 paramètres séparés.
Kelvin

1

Si vous devez cibler le lien vers un dossier spécifique (ou lui donner un nom spécifique), vous pouvez utiliser set name of result to "…"comme dans

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

Une explication du fonctionnement du script serait utile
user151019

Identique au script ci-dessus mais sans besoin de realpath
Andrew McClure

0

Pour les personnes qui souhaitent une solution python, voici une fonction enveloppant applescript, puis appelant 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.