Nautilus: diretório visitado via symlink, agora não consigo subir um nível na hierarquia de diretórios de destino

13

Eu criei um atalho por meio da opção "criar link". Quando eu entro na pasta desse atalho, não consigo ver nenhuma pasta acima dele, então não consigo navegar facilmente até eles.

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

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

    
por JohnDoea 13.01.2016 / 07:02

3 respostas

15

Por que esta é uma questão desafiadora

A pergunta tem alguns desafios:

  • nautilus não se comunica diretamente a partir da linha de comando, para obter o diretório atualmente ativo, por exemplo, nem pode "enviar" a pasta atualmente aberta (-window) para outro diretório a partir da linha de comando.
  • No caminho atual, conforme solicitado por "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 parece; precisamos encontrar soluções alternativas. Abaixo de 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 -l no link, que será produzido, 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 após -> é o caminho real dentro do symlink, ou, usando python :

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

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

Então, se tivermos o caminho, como podemos fazer o Nautilus subir um nível?

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

/path/to/a/folder

em

/path/to/a

então, usando xdotool para simular Ctrl + L (o atalho GUI para inserir um caminho em uma janela nautilus, já que não há opção cli para mover para outro diretório usando a janela atual ), e subseqüentemente fazer xclip colar o caminho editado + Enter , nós temos uma solução de trabalho!

Na prática

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

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

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

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

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 dos dois xdotool e xclip :

    sudo apt-get install xdotool xclip
    
  2. crie, se já 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) em ~/.local/share/nautilus/scripts e torne-o executável

  4. Você pode ter que sair e voltar.
  5. Agora, você deve conseguir executar o script clicando com o botão direito do mouse em em um arquivo (qualquer um) & gt; scripts & gt; level_up:

[ EDIT ] Eu alterei o script acima para colar o caminho na janela nautilus , em vez de fazer xdotool type isto. É needs xclip a 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ê poderia evitar o uso de xdotool , fazendo com que o script abra uma nova janela do nautilus, no diretório pai. O script seria 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é mesmo estender o script fechando a janela original e colocando a nova janela exatamente na mesma posição (& amp; tamanho).

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

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

Não é relevante para links existentes, mas quando usado a partir da GUI, um script nautilus para criar automaticamente arquivos executáveis .desktop ao clicar com o botão direito do mouse pode ser útil:

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

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

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) em ~/.local/share/nautilus/scripts e torne-o executável
  2. Use o script, escolhendo-o como uma opção de clique com o botão direito do mouse, como na primeira imagem. Um arquivo executável .desktop será criado no mesmo diretório, mova-o para outro lugar se você precisar; o caminho vinculado é absoluto.

Dê ao link um ícone distinto

Você poderia fornecer ao link alternativo um ícone de distinção. Se você procurar dentro do diretório /usr/share/icons para "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 é:

É claro que você também pode usar seu próprio ícone personalizado, mas se você usar caminhos completos (não use ~ ), você deve incluir a extensão do ícone.

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

Provavelmente a opção mais conveniente; Com a janela 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")

Para usar

  1. Para esta solução, xclip e xdotool precisam estar no seu sistema.

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

  3. Adicione a uma tecla de atalho: escolha: Configurações do sistema & gt; "Teclado" & gt; "Atalhos" & gt; "Atalhos personalizados". Clique no botão "+" e adicione o comando:

    python3 /path/to/level_up.py
    

NB As opções de atalho são um pouco limitadas neste caso, já que o próprio script irá simular Ctrl + L e Ctrl + Alt + L fará você sair ... Ctrl + \ funcionou bem no meu sistema.

Explicação

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

Esta opção pode ser útil se você preferir que o teclado use o botão direito do mouse.

    
por Jacob Vlijm 15.01.2016 / 22:06
3

Ou para o Ubuntu 14.04, nautilus 3.10-1, com o pacote xdotool adicionado, use o seguinte em .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 cotação final deve conter apenas uma nova linha ou retornar ( 0x0a ). O pwd de dentro do nautilus produz um resultado diferente de 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 é documentado, e nem consigo descobrir que tipo de ambiente de execução está executando o código (não consigo encontrar nenhum shell que produza esse resultado), mas funciona. É um hack, e é por isso que incluí a versão do nautilus. Quem sabe quanto tempo vai funcionar? Pode ser quebrado na próxima atualização do nautilus (ou no interpretador desconhecido), mas, para mim, ele funciona em links para locais montados, links para locais na árvore de diretórios ou apenas locais simples na árvore de diretórios.

    
por ubfan1 18.01.2016 / 17:20
2

Uma correção simples, mas que precisa ser reconstruída por fonte, revertendo this 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 criação:

  1. Fonte de download:

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

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

    Edite o 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. Criar & amp; instale-o

    autoreconf
    ./configure
    make
    

    Para testar sem instalação

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

    Para instalá-lo

    sudo make install
    

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

Referência: Como posso parar Nautilus de desreferenciando links simbólicos? [fechado]

    
por user.dz 16.01.2016 / 16:28