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

Respuestas:


10

Prueba esto en la Terminal:

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

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.


¿ ~/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

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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.