Nautilus: Diretório visitado via link simbólico, agora não posso subir um nível na hierarquia de diretórios de destino

14

Eu criei um atalho através da opção "criar link". Quando entro na pasta deste atalho, não consigo ver nenhuma pasta acima dela, portanto não consigo navegar facilmente até elas.

Existe uma maneira de subir uma pasta na GUI? Talvez uma tecla de atalho? (Não é possível fazer cd ..desta vez ^ __ ^).

insira a descrição da imagem aqui


No Windows, por exemplo, sou realmente capaz de navegar da maneira que descrevo, aqui está uma imagem do Win10 que explica:

insira a descrição da imagem aqui

JohnDoea
fonte
Você já tentou a tecla Backspace?
PenguinCSC 15/01
No Nautilus inferior a 3,16 é fácil adicionar um botão à barra de ferramentas pai Nautilus que tem que ser feito via a fonte> reconstruir (patch ou uma compilação ppa para 14,04 disponível) Caso contrário tentarAlt+up key
Doug
Alt + Up me leva do destino do link para a área de trabalho ... Infelizmente, não: \ Se alguém aqui tiver as conexões corretas, ele poderá oferecer isso diretamente à equipe de desenvolvimento? Eu tenho muito novo, então eu realmente não posso oferecê-lo diretamente, sem os dados têm de passar por muitas pessoas (eu acho) ...
JohnDoea
Ah - entendo o que você quer dizer. Talvez tente a solução de Jacob ou crie links você mesmo. Seus links atuais são vistos como um diretório, portanto, é o diretório o link está, normalmente na área de trabalho. Se você criar links usando um arquivo executável .desktop, a navegação após o uso desse 'link' será normal.
doug
Mesma pergunta aqui askubuntu.com/questions/713397/show-full-path-for-links (se resolvido, para marcar outro como duplicado)
user.dz

Respostas:

17

Por que essa é uma pergunta desafiadora

A questão tem alguns desafios:

  • nautilus não se comunica diretamente a partir da linha de comando, para obter o diretório ativo no momento, por exemplo, nem pode "enviar" a pasta atualmente aberta (-window) para outro diretório na linha de comando.
  • No caminho atual, conforme solicitado via "NAUTILUS_SCRIPT_CURRENT_URI", o Nautilus não retorna o caminho real para a pasta atual, mas "vê" o link como se fosse uma pasta real.

A solução, portanto, é tão suja quanto possível; precisamos encontrar soluções alternativas. Abaixo quatro opções para resolver o problema.

1. clique com o botão direito para subir um nível

Para obter o caminho real para o diretório atual, precisamos recuperar as informações do link. Podemos fazer isso usando ls -lo link, que irá gerar, por exemplo:

lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current

onde a seção depois ->é o caminho real dentro do link simbólico ou, usando python:

real = os.path.realpath("/path")

Usando isso em um nautilusscript, podemos obter indiretamente o caminho real para o arquivo ou pasta atual.

Então, se temos o caminho, como fazemos o nautilus subir um nível acima?

Novamente, não podemos resolver isso e manter as mãos limpas. Para subir um nível, primeiro editamos um pouco o caminho encontrado, de:

/path/to/a/folder

para dentro

/path/to/a

então, usando xdotoolpara simular Ctrl+ L(o atalho da GUI para inserir um caminho em uma janela do nautilus, já que não há opção cli para mover para outro diretório usando a janela atual ) e, posteriormente, xclipcolar o caminho editado + Enter, temos uma solução funcional !

Na prática

  1. Estamos em uma pasta, aberta em um link ("Link para Telegram") na minha área de trabalho. A pasta real é uma subpasta da minha Downloadspasta:

    insira a descrição da imagem aqui

  2. Então, se clicarmos com o botão direito do mouse em qualquer um dos arquivos dentro da pasta para executar o script:

    insira a descrição da imagem aqui

  3. Automaticamente, o caminho para o diretório superior é inserido:

    insira a descrição da imagem aqui

  4. E, também automaticamente, Returné pressionado e subimos um nível de diretório:

    insira a descrição da imagem aqui

O script

#!/usr/bin/env python3
import subprocess
import os
import time

def run(cmd):
    subprocess.call(["/bin/bash", "-c", cmd])

current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
real = os.path.realpath(current)
up = os.path.abspath(os.path.join(real, os.pardir))
run("xdotool key Control_L+l")
run("printf '"+up+"' | xclip -selection clipboard")
run("xdotool key Control_L+v")
# confirm by virtually press Return
time.sleep(0.1)
run("xdotool key Return")

Como configurar

  1. O script precisa de ambos xdotoole xclip:

    sudo apt-get install xdotool xclip
    
  2. criar, se ainda não existir, o diretório

    ~/.local/share/nautilus/scripts
    
  3. Copie o script acima em um arquivo vazio, salve-o como level_up(sem extensão) ~/.local/share/nautilus/scriptse torne-o executável

  4. Pode ser necessário sair e entrar novamente.
  5. Agora você deve poder executar o script clicando com o botão direito do mouse em um arquivo (qualquer)> scripts> level_up:

    insira a descrição da imagem aqui


[ EDIT ] Mudei o script acima para colar o caminho na nautilusjanela, em vez de xdotool digitar . Ele needs xclipdeve ser instalado, mas é uma grande melhoria, especialmente em caminhos muito longos.


2. Como alternativa, abra uma nova janela do nautilus no diretório superior

Você pode evitar o uso xdotool, criando o script para abrir uma nova janela do nautilus, no diretório dos pais. O script seria então ainda mais curto:

#!/usr/bin/env python3
import subprocess
import os

def run(cmd):
    subprocess.call(cmd)

current = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI").replace("file://", "").replace("%20", " ")
real = os.path.realpath(current)
up = real[:real.rfind("/")]
subprocess.Popen(["nautilus", up])

Nesse caso, você não precisaria instalar xdotool. Poderíamos até estender o script fechando a janela original e colocando a nova janela exatamente na mesma posição (& tamanho).

A desvantagem é que o histórico da janela original é perdido dessa maneira.

3. Uma solução adicional: maneira alternativa de criar (automaticamente) links

Não é relevante para os links existentes, mas quando usado na GUI, um script nautilus para criar automaticamente .desktoparquivos executáveis com o botão direito do mouse pode ser útil:

clique com o botão direito do mouse no diretório para criar um atalho (comportando-se como um link)

insira a descrição da imagem aqui

Ao contrário dos links simbólicos, esses links levarão você para a pasta real, sem se comportar como uma pasta:

insira a descrição da imagem aqui

O script

#!/usr/bin/env python3
import subprocess
import os

current = os.getenv(
    "NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
    ).replace("file://", "").replace("%20", " ").strip()

if os.path.isdir(current):
    parent = os.path.abspath(os.path.join(current, os.pardir))
    fldr_path = '"'+current+'"'
    folder = current[current.rfind("/")+1:]
    linkfilename = parent+"/"+folder+"link.desktop"
    linkdata = [
        "[Desktop Entry]",
        "Type=Application",
        "Name=Link to -> "+folder,
        "Icon=folder",
        "Exec=nautilus "+fldr_path,
        ]
    with open(linkfilename, "wt") as wt:
        for l in linkdata:
            wt.write(l+"\n")
    command = "chmod +x "+"'"+linkfilename+"'" 
    subprocess.Popen(["/bin/bash", "-c", command])

Como usar

  1. Copie o script em um arquivo vazio, salve-o como make_link(sem extensão) ~/.local/share/nautilus/scriptse torne-o executável
  2. Use o script escolhendo-o como uma opção de clique com o botão direito do mouse na primeira imagem. Um .desktoparquivo executável será criado no mesmo diretório; mova-o para outro local, se necessário; o caminho vinculado é absoluto.

Dê ao link um ícone distintivo

Você pode dar ao link alternativo um ícone distintivo. Se você pesquisar dentro do diretório /usr/share/iconspor "pasta", várias opções válidas serão exibidas.

Se no script a linha "Icon=folder",for substituída por Icon=stock_folder-copy,(use o nome do ícone sem extensão), o resultado no meu sistema será:

insira a descrição da imagem aqui

Claro que você pode usar seu próprio ícone personalizado, bem como, mas se você usar caminhos completos (não use ~), você deve incluir a extensão do ícone.

4. Vá para o diretório superior com uma tecla de atalho

Provavelmente a opção mais conveniente; com a janela do nautilus na frente, pressione uma tecla de atalho para mover um diretório para cima.

O script

#!/usr/bin/env python3
import subprocess
import time
import os

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def run(cmd):
    subprocess.call(["/bin/bash", "-c", cmd])

# get information on the active window
front = get(["xprop", "-id", get(["xdotool", "getactivewindow"])])
# (only) if it is a "normal" nautilus window, take action
if 'WM_CLASS(STRING) = "nautilus", "Nautilus"' in front:
    # "virtually" press Ctrl + l
    run("xdotool key Control_L+l"); time.sleep(0.05)
    # copy the current path, calculate the "real" parent directory
    real = os.path.realpath(get(["xclip", "-o"]))
    up = os.path.abspath(os.path.join(real, os.pardir))
    time.sleep(0.1)
    # enter the superior directory
    run("printf '"+up+"' | xclip -selection clipboard")
    run("xdotool key Control_L+v")
    # confirm by virtually press Return
    time.sleep(0.1)
    run("xdotool key Return")

Usar

  1. Para esta solução, ambos xclipe xdotoolprecisam estar no seu sistema.

    sudo apt-get install xdodool xclip
    
  2. Copie o script para um arquivo vazio, salve-o como level_up.py(em qualquer lugar).

  3. Adicione-o a uma tecla de atalho: escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando:

    python3 /path/to/level_up.py
    

Nota: as opções de atalho são um pouco limitadas neste caso, pois o próprio scriptsimularáCtrl+LeCtrl+Alt+Lfará com que você efetue logout ...Ctrl+\funcionou bem no meu sistema.

Explicação

Esse script também simula Ctrl+ L, mas, em vez de usar o nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI", ele usa xclippara copiar o caminho selecionado automaticamente na janela do nautilus. Como a opção 1, o script calcula o caminho real e deriva o diretório superior.

Essa opção pode ser útil se você preferir o teclado usando o botão direito do mouse.

Jacob Vlijm
fonte
3

Ou para o Ubuntu 14.04, nautilus 3.10-1, com o xdotoolpacote adicionado, basta usar o seguinte em seu .local/share/nautilus/scripts/updirtree arquivo:

# In nautilus, the pwd is the actual, not the link path
xdotool key ctrl-l
xdotool type "$(dirname $(pwd))" "
"

A citação final deve conter apenas uma nova linha ou return ( 0x0a). O pwdde dentro do nautilus produz um resultado diferente do que quando executado a partir de um bash / terminal - ele retorna o caminho real, não o caminho usando o link.


Concordo que não faz sentido, não está documentado e não consigo nem imaginar que tipo de ambiente de execução está executando o código (não consigo encontrar nenhum shell que produz esse resultado), mas funciona. É um hack, e é por isso que incluí a versão do nautilus. Quem sabe quanto tempo vai funcionar? Pode ser interrompido na próxima atualização do nautilus (ou no intérprete desconhecido), mas, para mim, funciona em links para locais montados, links para locais na árvore de diretórios ou apenas locais simples na árvore de diretórios.

ubfan1
fonte
Eu uso o Ubuntu 15.10 ... Pode funcionar, talvez em um código semelhante?
precisa saber é o seguinte
1
Isso não faz sentido, $(pwd)é o diretório de trabalho do shell , não do nautilus . Veja help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm
@benos Confirmo, ele funciona em 15.10
user.dz 18/01/16
@JacobVlijm, Funciona bem, me parece razoável, o nautilus executa scripts no diretório atual.
user.dz
1
Também @Sneetsher, para minha surpresa, funciona. No entanto, você tem um problema de tempo quando usado em caminhos muito longos. Você precisará definir uma pausa, dependendo do comprimento do caminho. Outros caminhos digitados parecem estar quebrados. Inicialmente, eu o corrigi com uma interrupção (arbitrária). Na versão mais recente, xclip colei o caminho, que não está sujeito ao comprimento do caminho.
Jacob Vlijm
2

Uma correção limpa, mas precisa da reconstrução da fonte revertendo este commit :

diff --git a/src/nautilus-mime-actions.c b/src/nautilus-mime-actions.c
index ca1f0ac..0b363b4 100644
--- a/src/nautilus-mime-actions.c
+++ b/src/nautilus-mime-actions.c
@@ -2029,21 +2029,13 @@ activate_activation_uris_ready_callback (GList *files_ignore,

    /* Convert the files to the actual activation uri files */
    for (l = parameters->locations; l != NULL; l = l->next) {
-       char *uri = NULL;
-
+       char *uri;
        location = l->data;

        /* We want the file for the activation URI since we care
         * about the attributes for that, not for the original file.
         */
-       if (nautilus_file_is_symbolic_link (location->file)) {
-           uri = nautilus_file_get_symbolic_link_target_uri (location->file);
-       }
-
-       if (uri == NULL) {
-           uri = nautilus_file_get_activation_uri (location->file);
-       }
-
+       uri = nautilus_file_get_activation_uri (location->file);
        if (uri != NULL) {
            launch_location_update_from_uri (location, uri);
        }

Instruções de construção:

  1. Fonte do download:

    apt-get source nautilus
    
  2. Baixar dependências de compilação

    sudo apt-get build-dep nautilus
    
  3. Faça a modificação necessária do patch acima

    Editar src/nautilus-mime-actions.c

    /* Convert the files to the actual activation uri files */
    for (l = parameters->locations; l != NULL; l = l->next) {
        char *uri = NULL;
        location = l->data;
    
        /* We want the file for the activation URI since we care
         * about the attributes for that, not for the original file.
         */
        if (nautilus_file_is_symbolic_link (location->file)) {
            uri = nautilus_file_get_symbolic_link_target_uri (location->file);
        }
    
        if (uri == NULL) {
            uri = nautilus_file_get_activation_uri (location->file);
        }
    
        if (uri != NULL) {
            launch_location_update_from_uri (location, uri);
        }
    
  4. Construa e instale

    autoreconf
    ./configure
    make
    

    Para testar sem instalação

    sudo killall -r "[\w]*nautilus"
    ./src/nautilus
    

    Para instalá-lo

    sudo make install
    

Isso fará o nautilus resolver os links no caminho de destino. BTW, isso foi relatado como bug há algum tempo. Se você acha que esse é um recurso, envie outro relatório de bug, solicitando a opção de configuração ou atalho específico para ele.

Referência: Como impedir o Nautilus de remover referências de links simbólicos? [fechadas]

user.dz
fonte
Um problema pode ser que você precisa fixar a versão atual do nautilus ou repetir o procedimento após cada atualização.
Jacob Vlijm
1
@ JacobVlijm, sim, será assim se eu construir o pacote deb. Mas eu não, ele será instalado /usr/local/bin/, de modo que o sistema sempre executar a cópia modificada, conforme listado na$PATH
user.dz