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
-
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
: -
Então, se clicarmos com o botão direito do mouse em qualquer 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 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
-
O script precisa dos dois
xdotool
exclip
:sudo apt-get install xdotool xclip
-
crie, se já 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) em~/.local/share/nautilus/scripts
e torne-o executável - Você pode ter que sair e voltar.
-
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
- 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 - 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
-
Para esta solução,
xclip
exdotool
precisam estar no seu sistema.sudo apt-get install xdodool xclip
-
Copie o script em um arquivo vazio, salve-o como
level_up.py
(em qualquer lugar). -
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.