¿Puedo crear un acceso directo de escritorio / alias a una carpeta desde la terminal?

17

Me gustaría crear un acceso directo de escritorio a una carpeta específica, enterrada en lo más profundo ~/Library/. La biblioteca está oculta de forma predeterminada en Lion, y me gustaría mantenerla así, por varias razones. ¿Existe una acción de línea de comandos de un solo paso que pueda usar para crear un acceso directo de escritorio a una ruta determinada? Me gustaría evitar soluciones que impliquen mostrar la Biblioteca, crear el Alias ​​usando Finder y volver a ocultarlo. Sé cómo hacerlo, pero para mis propósitos, sería preferible una sola línea que se pueda pegar en la Terminal y terminar con ella.

LessPop_MoreFizz
fuente

Respuestas:

10

Prueba esto en la Terminal:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Boj
fuente
55
Creo que quisiste decir ln -s ~/Library/path/to/folder folder. Una desventaja menor de este método (es decir, enlace simbólico) es que el enlace se romperá si el "original" (es decir, el objetivo) se mueve o cambia de nombre.
Kelvin
2
El segundo argumento folderno es obligatorio. Si lo omite, lncrea un enlace con el mismo nombre que la carpeta original.
Boj
Ah, tienes razon. Tengo un error antes, pero debo haber escrito mal algo.
Kelvin
1
Sé lo que era: ¡no puedes tener un corte final!
Kelvin
12
Los alias OSX no son enlaces simbólicos. Ver stackoverflow.com/questions/11165799/…
bfontaine
13

Es posible hacerlo en una línea de Terminal. Digamos que desea alias al archivo "/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'

Debe reemplazar to filecon to foldersi tiene una carpeta.

Aquí hay un script de shell que le permite pasar una ruta de archivo o carpeta para crear el 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 nombra a este guión make-alias.sh, chmod u+x make-alias.shy lo puso en /usr/local/bin, por ejemplo, puede ejecutar make-alias.sh ~/Library/Preferences.

Kelvin
fuente
¿ ~/Library/Preferences/org.herf.Flux.plist"Funcionará o el nombre de usuario debe incluirse explícitamente en el comando Terminal?
LessPop_MoreFizz
Acabo de intentar usar ~y no funciona con el osascriptcomando de una línea . Sugiero usar el archivo de script en su lugar, porque ~se convierte automáticamente.
Kelvin
Hmm Parece romperse en los nombres de archivos con espacios como/Library/Application Support/
LessPop_MoreFizz
Si está utilizando el script bash, debe poner el nombre del archivo entre comillas simples si tiene espacios o caracteres especiales. Sin embargo, esto evitará que ~se expanda. Lo mejor es no usar comillas, y completar con una pestaña el nombre del archivo para que bash "escape" correctamente los caracteres especiales. Por ejemplo, escriba y ~/Library/Applicationluego presione tab. Si Application Supportfue la única coincidencia, el shell debería haber insertado una barra diagonal inversa antes del espacio. También puede usar manualmente una barra invertida para escapar.
Kelvin
Tenga en cuenta que el problema de espacios / caracteres especiales existiría en cualquier solución: el shell no puede saber que quería pasar 1 parámetro en lugar de 2 parámetros separados.
Kelvin
1

En caso de que necesite orientar el enlace a una carpeta específica (o darle un nombre específico), puede usarlo set name of result to "…"como en

#!/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
fuente
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
fuente
Sería útil una explicación de cómo funciona el script
user151019
Igual que la secuencia de comandos anterior, pero sin necesidad de realpath
Andrew McClure
0

Para las personas que desean una solución de Python, aquí hay una función que ajusta el script de manzana, y luego llama a 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
fuente