Posso criar um atalho / alias da área de trabalho para uma pasta no terminal?

17

Gostaria de criar um atalho na área de trabalho para uma pasta específica, enterrada no fundo ~/Library/. A Biblioteca está oculta por padrão no Lion e eu gostaria de mantê-la assim, por vários motivos. Existe uma ação de linha de comando em uma etapa que posso usar para criar um atalho na área de trabalho para um determinado caminho? Gostaria de evitar soluções que envolvam reexibir a Biblioteca, criar o Alias ​​usando o Finder e reexibir. Eu sei como fazer isso, mas para meus propósitos, uma única linha que pode ser colada no Terminal e concluída com ele seria preferível.

LessPop_MoreFizz
fonte

Respostas:

10

Tente isso no Terminal:

cd ~/Desktop
ln -s ~/Library/path/to/folder
Boj
fonte
5
Eu acho que você quis dizer ln -s ~/Library/path/to/folder folder. Uma pequena desvantagem desse método (ou seja, ligação simbólica) é que o link será quebrado se o "original" (ou seja, o destino) for movido ou renomeado.
Kelvin
2
O segundo argumento foldernão é necessário. Se você o omitir, lncria um link com o mesmo nome da pasta original.
Boj
Ah, você está certo. Eu já tinha um erro antes, mas devo ter digitado algo errado.
Kelvin
1
Eu sei o que era - você não pode ter uma barra à direita!
Kelvin #
12
Aliases OSX não são links simbólicos. Veja stackoverflow.com/questions/11165799/…
bfontaine
13

É possível fazer isso em uma linha do terminal. Digamos que você queira criar um alias para o arquivo "/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'

Você deve substituir to filepor to folderse tiver uma pasta.

Aqui está um script de shell que permite passar um caminho de arquivo ou pasta para criar o 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

Se você nomear esse script make-alias.sh, chmod u+x make-alias.she colocá-lo em /usr/local/bin, você pode executar por exemplo make-alias.sh ~/Library/Preferences.

Kelvin
fonte
Funcionará ~/Library/Preferences/org.herf.Flux.plist"ou o nome de usuário precisa ser explicitamente incluído no comando Terminal?
LessPop_MoreFizz
Eu apenas tentei usar ~e ele não funciona com o osascriptcomando de uma linha . Sugiro usar o arquivo de script, porque o ~é convertido automaticamente.
Kelvin
Hmm. Parece quebrar em nomes de arquivos com espaços como/Library/Application Support/
LessPop_MoreFizz 20/12/12
Se você estiver usando o script bash, coloque o nome do arquivo entre aspas simples, se houver espaços ou caracteres especiais. No entanto, isso impedirá a ~expansão. A melhor coisa é não usar aspas, e tabular o nome do arquivo para que o bash "escape" adequadamente dos caracteres especiais. Por exemplo, digite ~/Library/Applicatione pressione tab. Se Application Supportfoi a única correspondência, o shell deve ter inserido uma barra invertida antes do espaço. Você também pode usar manualmente uma barra invertida para escapar.
Kelvin
Observe que o problema de espaços / caracteres especiais existiria em qualquer solução - o shell não pode saber que você pretendia passar 1 parâmetro em vez de 2 parâmetros separados.
Kelvin
1

Caso você precise direcionar o link para uma pasta específica (ou atribuir um nome específico), use-o set name of result to "…"como em

#!/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
fonte
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
fonte
Uma explicação de como o script funciona seria útil
user151019
Mesmo que script acima, mas sem necessidade de realpath
Andrew McClure
0

Para as pessoas que desejam uma solução python, aqui está uma função que envolve o applecript e, em seguida, chama 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
fonte