Czy mogę utworzyć skrót pulpitu / alias do folderu z terminala?

17

Chciałbym utworzyć skrót na pulpicie do określonego folderu głęboko w nim ukrytego ~/Library/. Biblioteka jest domyślnie ukryta w programie Lion i chciałbym ją zachować z różnych powodów. Czy mogę wykonać jednoetapowe działanie w wierszu polecenia, aby utworzyć skrót na pulpicie do danej ścieżki? Chciałbym uniknąć rozwiązań polegających na odsłonięciu biblioteki, utworzeniu aliasu za pomocą Findera i ukryciu go. Wiem, jak to zrobić, ale dla moich celów lepsza byłaby pojedyncza linia, którą można wkleić do Terminala.

LessPop_MoreFizz
źródło

Odpowiedzi:

10

Wypróbuj to na terminalu:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Boj
źródło
5
Myślę, że miałeś na myśli ln -s ~/Library/path/to/folder folder. Jedną niewielką wadą tej metody (tj. Dowiązania symbolicznego) jest to, że łącze zostanie zerwane, jeśli „oryginał” (tj. Cel) zostanie przeniesiony lub zostanie zmieniona jego nazwa.
Kelvin,
2
Drugi argument foldernie jest wymagany. Jeśli go pominiesz, lntworzy link o nazwie takiej samej jak oryginalny folder.
Boj
Ach, masz rację. Wcześniej miałem błąd, ale musiałem coś pomylić.
Kelvin,
1
Wiem, co to było - nie możesz mieć końcowego cięcia!
Kelvin,
12
Aliasy OSX nie są dowiązaniami symbolicznymi. Zobacz stackoverflow.com/questions/11165799/…
bfontaine
13

Można to zrobić w jednej linii terminala. Załóżmy, że chcesz uzyskać alias do pliku „/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'

Należy wymienić to fileze to folderjeśli masz folder.

Oto skrypt powłoki, który pozwala przekazać ścieżkę do pliku lub folderu w celu utworzenia aliasu:

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

Jeśli nazwa tego skryptu make-alias.sh, chmod u+x make-alias.shi umieścić go w /usr/local/bin, można uruchomić np make-alias.sh ~/Library/Preferences.

kelwin
źródło
Czy będzie ~/Library/Preferences/org.herf.Flux.plist"działać, czy też nazwa użytkownika musi być wyraźnie zawarta w poleceniu terminalu?
LessPop_MoreFizz
Właśnie próbowałem użyć ~i nie działa z osascriptpoleceniem jednowierszowym. Sugeruję użycie zamiast tego pliku skryptu, ponieważ ~jest on konwertowany automatycznie.
Kelvin,
Hmm Wydaje się, że łamie nazwy plików spacjami, takimi jak/Library/Application Support/
LessPop_MoreFizz
Jeśli używasz skryptu bash, powinieneś umieścić nazwę pliku w cudzysłowie, jeśli zawiera spacje lub znaki specjalne. Zapobiegnie ~to jednak rozszerzeniu. Najlepiej nie używać cudzysłowów i wstawiać do nazwy pliku tab, aby bash poprawnie „uciekł” od znaków specjalnych. Np. Wpisz, ~/Library/Applicationa następnie naciśnij tab. Jeśli Application Supportbyło to jedyne dopasowanie, powłoka powinna wstawić ukośnik przed spacją. Możesz także ręcznie użyć odwrotnego ukośnika, aby uciec.
Kelvin,
Zauważ, że problem spacji / znaków specjalnych istniałby w każdym rozwiązaniu - powłoka nie może wiedzieć, że chcesz przekazać 1 parametr zamiast 2 oddzielnych.
Kelvin,
1

Jeśli chcesz skierować link do określonego folderu (lub nadać mu konkretną nazwę), możesz użyć set name of result to "…"jak w

#!/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
źródło
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
źródło
Przydatne byłoby wyjaśnienie działania skryptu
użytkownik151019,
Taki sam jak powyższy skrypt, ale bez potrzeby prawdziwej ścieżki
Andrew McClure,
0

Dla osób, które chciałyby rozwiązania w języku Python, oto funkcja owijania skryptu apple, a następnie wywoływania 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)
Jerry T.
źródło