Kann ich vom Terminal aus eine Desktop-Verknüpfung / einen Desktop-Alias ​​für einen Ordner erstellen?

17

Ich möchte eine Desktop-Verknüpfung zu einem bestimmten Ordner erstellen, der tief im Inneren vergraben ist ~/Library/. Die Bibliothek ist in Lion standardmäßig ausgeblendet, und ich möchte dies aus verschiedenen Gründen beibehalten. Gibt es eine einstufige Befehlszeilenaktion, mit der ich eine Desktopverknüpfung zu einem bestimmten Pfad erstellen kann? Ich möchte Lösungen vermeiden, bei denen die Bibliothek ausgeblendet, der Alias ​​mit dem Finder erstellt und neu erstellt wird. Ich weiß, wie das geht, aber für meine Zwecke wäre eine einzelne Zeile vorzuziehen, die in Terminal eingefügt und damit erledigt werden kann.

LessPop_MoreFizz
quelle

Antworten:

10

Versuchen Sie dies auf dem Terminal:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Boj
quelle
5
Ich denke du meintest ln -s ~/Library/path/to/folder folder. Ein kleiner Nachteil dieser Methode (dh Symlinking) besteht darin, dass die Verknüpfung unterbrochen wird, wenn das "Original" (dh das Ziel) verschoben oder umbenannt wird.
Kelvin
2
Das zweite Argument folderist nicht erforderlich. Wenn Sie es nicht angeben, lnerstellt eine Verknüpfung der gleiche wie der ursprüngliche Ordner mit dem Namen.
Boj
Ah, du hast recht. Ich habe vorher einen Fehler bekommen, aber ich muss etwas falsch geschrieben haben.
Kelvin
1
Ich weiß, was es war - Sie können keinen nachgestellten Schrägstrich haben!
Kelvin
12
OSX - Aliase sind nicht symbolische Links. Siehe stackoverflow.com/questions/11165799/…
bfontaine
13

Es ist möglich, dies in einer Zeile des Terminals zu tun. Angenommen, Sie möchten einen Alias ​​für die Datei "/Users/me/Library/Preferences/org.herf.Flux.plist" erstellen.

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'

Sie sollten ersetzen to filemit , to folderwenn Sie einen Ordner.

Hier ist ein Shell-Skript, mit dem Sie einen Datei- oder Ordnerpfad übergeben können, um den Alias ​​zu erstellen:

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

Wenn Sie dieses Skript nennen make-alias.sh, chmod u+x make-alias.shund steckte es in /usr/local/bin, können Sie zB laufen make-alias.sh ~/Library/Preferences.

Kelvin
quelle
Funktioniert ~/Library/Preferences/org.herf.Flux.plist"oder muss der Benutzername explizit im Terminal-Befehl enthalten sein?
LessPop_MoreFizz
Ich habe es gerade versucht ~und es funktioniert nicht mit dem einzeiligen osascriptBefehl. Ich schlage vor, stattdessen die Skriptdatei zu verwenden, da diese ~automatisch konvertiert wird.
Kelvin
Hmm. Scheint auf Dateinamen mit Leerzeichen wie/Library/Application Support/
LessPop_MoreFizz
Wenn Sie das Bash-Skript verwenden, sollten Sie den Dateinamen in einfache Anführungszeichen setzen, wenn er Leerzeichen oder Sonderzeichen enthält. Dies verhindert ~jedoch eine Erweiterung. Das Beste ist, keine Anführungszeichen zu verwenden und den Dateinamen auf der Registerkarte zu vervollständigen, damit bash den Sonderzeichen ordnungsgemäß "entgeht". ZB tippen und ~/Library/Applicationdann die Tabulatortaste drücken. Wenn dies Application Supportdie einzige Übereinstimmung war, sollte die Shell vor dem Leerzeichen einen Backslash eingefügt haben. Sie können auch manuell einen Backslash verwenden, um zu entkommen.
Kelvin
Beachten Sie, dass das Problem mit Leerzeichen / Sonderzeichen in jeder Lösung vorhanden ist - die Shell kann nicht wissen, dass Sie 1 Parameter anstelle von 2 separaten Parametern übergeben wollten.
Kelvin
1

Falls Sie den Link auf einen bestimmten Ordner ausrichten müssen (oder ihm einen bestimmten Namen geben müssen), können Sie ihn set name of result to "…"wie in verwenden

#!/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
quelle
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
quelle
Eine Erklärung, wie das Skript funktioniert, wäre nützlich
user151019
Wie oben beschrieben, jedoch ohne Realpath
Andrew McClure
0

Für Leute, die eine Python-Lösung wünschen, gibt es hier eine Funktion, die Applescript umschließt und dann subprocess.call aufruft:

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.
quelle