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

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

Antworten (5)

Versuchen Sie dies im Terminal:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Ich glaube du meintest ln -s ~/Library/path/to/folder folder. Ein kleiner Nachteil dieser Methode (dh Symlinking) ist, dass der Link unterbrochen wird, wenn das "Original" (dh das Ziel) verschoben oder umbenannt wird.
Das zweite Argument folderist nicht erforderlich. Wenn Sie es weglassen, lnwird ein Link mit dem gleichen Namen wie der ursprüngliche Ordner erstellt.
Ah, du hast recht. Ich habe vorher einen Fehler bekommen, aber ich muss mich vertippt haben.
Ich weiß, was es war - Sie können keinen abschließenden Schrägstrich haben!
OSX-Aliase sind keine symbolischen Links. Siehe stackoverflow.com/questions/11165799/…
Das ist nicht korrekt – ein OSX-Alias ​​ist kein symbolischer Unix-Link. Die richtige Antwort finden Sie in der von @Kelvin geposteten Lösung: apple.stackexchange.com/a/51712/109837
Funktioniert immer noch auf Mac 10.12 und es ist schön und einfach. Danke dir.

Es ist möglich, dies in einer Zeile des Terminals zu tun. Angenommen, Sie möchten einen Alias ​​auf 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'

to fileSie sollten durch ersetzen, to folderwenn Sie einen Ordner haben.

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 benennen make-alias.shund chmod u+x make-alias.sheinfügen /usr/local/bin, können Sie zB ausführen make-alias.sh ~/Library/Preferences.

Funktioniert ~/Library/Preferences/org.herf.Flux.plist"oder muss der Benutzername explizit in den Terminal-Befehl aufgenommen werden?
Ich habe gerade versucht zu verwenden ~und es funktioniert nicht mit dem einzeiligen osascriptBefehl. Ich schlage vor, stattdessen die Skriptdatei zu verwenden, da die ~automatisch konvertiert wird.
Hmm. Scheint bei Dateinamen mit Leerzeichen wie z/Library/Application Support/
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 mit der Tabulatortaste zu vervollständigen, damit Bash die Sonderzeichen ordnungsgemäß "escaped" wird. Geben Sie zB ein ~/Library/Applicationund drücken Sie dann die Tabulatortaste. Wenn Application Supportes die einzige Übereinstimmung war, hätte die Shell vor dem Leerzeichen einen umgekehrten Schrägstrich einfügen sollen. Sie können auch manuell einen umgekehrten Schrägstrich verwenden, um zu entkommen.
Beachten Sie, dass das Problem mit Leerzeichen/Sonderzeichen in jeder Lösung bestehen würde - die Shell kann nicht wissen, dass Sie 1 Parameter statt 2 separate Parameter übergeben wollten.
Sie könnten auch einen Alias ​​erzwingen, anstatt den Typ anzugeben: osascript -e "tell app \"Finder\" to make new alias to (posix file \"$1\") as alias at desktop".

Falls Sie den Link auf einen bestimmten Ordner ausrichten müssen (oder ihm einen bestimmten Namen geben müssen), können Sie set name of result to "…"as 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
#!/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
Eine Erklärung, wie das Skript funktioniert, wäre hilfreich
Dasselbe wie das obige Skript, aber ohne Realpath

Für Leute, die eine Python-Lösung möchten, hier ist 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
    """
    # https://apple.stackexchange.com/questions/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)