¿Por qué esta es una pregunta desafiante?
La pregunta tiene algunos desafíos:
nautilus
no se comunica directamente desde la línea de comandos, por ejemplo, para obtener el directorio activo actualmente, ni puede "enviar" la carpeta actualmente abierta (-ventana) a otro directorio desde la línea de comandos.
- En la ruta actual, como se solicitó a través de
"NAUTILUS_SCRIPT_CURRENT_URI"
, Nautilus no devuelve la ruta real a la carpeta actual, pero "ve" el enlace como si fuera una carpeta real.
Por lo tanto, la solución es tan sucia como se pone; Necesitamos encontrar soluciones. A continuación, cuatro opciones para resolver el problema.
1. haga clic derecho para subir un nivel
Para obtener la ruta real al directorio actual, tenemos que recuperar información del enlace. Podemos hacerlo usando ls -l
el enlace, que generará, por ejemplo:
lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current
donde la sección posterior ->
es la ruta real dentro del enlace simbólico, o, usando python
:
real = os.path.realpath("/path")
Al usar esto en un nautilus
script, podemos obtener indirectamente la ruta real al archivo o carpeta actual.
Entonces, si tenemos el camino, ¿cómo hacemos que el nautilus suba un nivel?
Nuevamente, no podemos resolver esto y mantener nuestras manos limpias. Para subir un nivel, primero editamos un poco la ruta encontrada, desde:
/path/to/a/folder
dentro
/path/to/a
luego, usando xdotool
para simular Ctrl+ L(el acceso directo de GUI para insertar una ruta en una ventana de nautilus, ya que no hay una opción cli para mover a otro directorio usando la ventana actual ), y luego xclip
pegar la ruta editada + Enter, tenemos una solución de trabajo !
En la práctica
Estamos en una carpeta, abierta desde un enlace ("Enlace a Telegram") en mi escritorio. La carpeta real es una subcarpeta de mi Downloads
carpeta:
Luego, si hacemos clic derecho en cualquiera de los archivos dentro de la carpeta para ejecutar el script:
Automáticamente, se inserta la ruta al directorio superior:
Y, también automáticamente, Returnse presiona, y subimos un nivel de directorio hacia arriba:
La secuencia de comandos
#!/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 instalar
El script necesita ambos xdotool
y xclip
:
sudo apt-get install xdotool xclip
crear, si aún no existe, el directorio
~/.local/share/nautilus/scripts
Copie el script anterior en un archivo vacío, guárdelo como level_up
(sin extensión) ~/.local/share/nautilus/scripts
y hágalo ejecutable
- Puede que tenga que cerrar sesión y volver a iniciarla.
Ahora debería poder ejecutar el script haciendo clic derecho en un archivo (cualquiera)> scripts> level_up:
[ EDITAR ] Cambié el script anterior para pegar la ruta en la nautilus
ventana, en lugar de xdotool
escribirlo . Se needs
xclip
instalará, pero es una mejora importante, especialmente en caminos muy largos.
2. Alternativamente, abra una nueva ventana nautilus en el directorio superior
Usted podría evitar el uso de xdotool
, al hacer el guión abrir una nueva ventana de Nautilus, en el directorio de los padres. El guión sería aún más corto:
#!/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])
En este caso, no necesitaría instalar xdotool
. Incluso podríamos extender el script cerrando la ventana original y colocando la nueva ventana exactamente en la misma posición (y tamaño).
La desventaja es que el historial de la ventana original se pierde de esta manera.
3. Una solución adicional: forma alternativa de crear (automáticamente) enlaces
No es relevante para los enlaces existentes, pero cuando se usa desde la GUI, un script nautilus para crear automáticamente .desktop
archivos ejecutables al hacer clic derecho puede ser útil:
haga clic derecho en el directorio para crear un acceso directo (que se comporta como un enlace)
A diferencia de los enlaces simbólicos, estos enlaces lo llevarán a la carpeta real, sin comportarse como una carpeta en sí:
La secuencia de comandos
#!/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])
Cómo utilizar
- Copie el script en un archivo vacío, guárdelo como
make_link
(sin extensión) ~/.local/share/nautilus/scripts
y hágalo ejecutable
- Use el script seleccionándolo como una opción de clic derecho como en la primera imagen. Se
.desktop
creará un archivo ejecutable en el mismo directorio, muévalo a otro lugar si es necesario; La ruta vinculada es absoluta.
Dale al enlace un ícono distintivo
Puede dar al enlace alternativo un icono distintivo. Si busca dentro del directorio /usr/share/icons
"carpeta", aparecen numerosas opciones válidas.
Si en la secuencia de comandos "Icon=folder",
se reemplaza la línea por Icon=stock_folder-copy,
(use el nombre del icono sin extensión), el resultado en mi sistema es:
Por supuesto, también puede usar su propio icono personalizado, pero si usa rutas completas (no use ~
), debe incluir la extensión del icono.
4. Vaya al directorio superior con una tecla de acceso directo
Probablemente la opción más conveniente; con la ventana de nautilus al frente, presione una tecla de acceso directo para mover un directorio hacia arriba.
La secuencia de comandos
#!/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 solución, ambos xclip
y xdotool
Deben estar en su sistema.
sudo apt-get install xdodool xclip
Copie el script en un archivo vacío, guárdelo como level_up.py
(en cualquier lugar).
Agréguelo a una tecla de acceso directo: elija: Configuración del sistema> "Teclado"> "Accesos directos"> "Accesos directos personalizados". Haga clic en "+" y agregue el comando:
python3 /path/to/level_up.py
Nota : las opciones de acceso directo son un poco limitadas en este caso, ya que el script en sí simularáCtrl+L, yCtrl+Alt+Lhará que cierre la sesión ...Ctrl+\funcionó bien en mi sistema.
Explicación
Este script también simula Ctrl+ L, pero en lugar de usar nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI"
, usa xclip
para copiar la ruta seleccionada automáticamente en la ventana de nautilus. Al igual que la opción 1, el script calcula la ruta real y deriva el directorio superior.
Esta opción puede ser útil si prefiere que el teclado utilice el botón derecho.