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 -l
o 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 nautilus
script, 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 xdotool
para 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, xclip
colar o caminho editado + Enter, temos uma solução funcional !
Na prática
Estamos em uma pasta, aberta em um link ("Link para Telegram") na minha área de trabalho. A pasta real é uma subpasta da minha Downloads
pasta:
Então, se clicarmos com o botão direito do mouse em qualquer um dos arquivos dentro da pasta para executar o script:
Automaticamente, o caminho para o diretório superior é inserido:
E, também automaticamente, Returné pressionado e subimos um nível de diretório:
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
O script precisa de ambos xdotool
e xclip
:
sudo apt-get install xdotool xclip
criar, se ainda não existir, o diretório
~/.local/share/nautilus/scripts
Copie o script acima em um arquivo vazio, salve-o como level_up
(sem extensão) ~/.local/share/nautilus/scripts
e torne-o executável
- Pode ser necessário sair e entrar novamente.
Agora você deve poder executar o script clicando com o botão direito do mouse em um arquivo (qualquer)> scripts> level_up:
[ EDIT ] Mudei o script acima para colar o caminho na nautilus
janela, em vez de xdotool
digitar . Ele needs
xclip
deve 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 .desktop
arquivos 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)
Ao contrário dos links simbólicos, esses links levarão você para a pasta real, sem se comportar como uma pasta:
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
- Copie o script em um arquivo vazio, salve-o como
make_link
(sem extensão) ~/.local/share/nautilus/scripts
e torne-o executável
- Use o script escolhendo-o como uma opção de clique com o botão direito do mouse na primeira imagem. Um
.desktop
arquivo 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/icons
por "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á:
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
Para esta solução, ambos xclip
e xdotool
precisam estar no seu sistema.
sudo apt-get install xdodool xclip
Copie o script para um arquivo vazio, salve-o como level_up.py
(em qualquer lugar).
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 xclip
para 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.