Nautilus: visitó el directorio a través del enlace simbólico, ahora no puedo subir un nivel en la jerarquía del directorio de destino

14

Creé un acceso directo a través de la opción "hacer enlace". Cuando entro en la carpeta de este acceso directo, no puedo ver ninguna carpeta encima, así que no puedo navegar fácilmente hacia ellas.

¿Hay alguna manera de subir una carpeta en la GUI? Tal vez una tecla de acceso rápido? (No se puede hacer cd ..esta vez ^ __ ^).

ingrese la descripción de la imagen aquí


En Windows, por ejemplo, puedo navegar de la manera que describo, aquí hay una imagen de Win10 que lo explica:

ingrese la descripción de la imagen aquí

JohnDoea
fuente
¿Has probado la tecla Retroceso?
PenguinCSC
En nautilus menos de 3.16 es fácil agregar un botón principal a la barra de herramientas de nautilus, aunque debe hacerse a través de la fuente> reconstruir (parche o una compilación de ppa para 14.04 disponible) De lo contrario, intenteAlt+up key
doug
Alt + Up me lleva desde el destino del enlace al escritorio ... Así que lamentablemente no: \ Si alguien aquí tiene las conexiones correctas, ¿podría ofrecer esto directamente al equipo de desarrollo? Soy muy nuevo, así que realmente no puedo ofrecerlo directamente, sin que los datos tengan que pasar a través de muchas personas (supongo) ...
JohnDoea
Ah, ya veo lo que quieres decir. Quizás pruebe la solución de Jacob o cree enlaces usted mismo. Sus enlaces actuales se ven como un directorio, así que arriba está el directorio. el enlace está en, típicamente el escritorio. Si crea enlaces usando un archivo ejecutable .desktop, la navegación después de usar ese 'enlace' será normal.
doug
La misma pregunta aquí askubuntu.com/questions/713397/show-full-path-for-links (si se resuelve, para marcar otro como duplicado)
user.dz

Respuestas:

17

¿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 -lel 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 nautilusscript, 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 xdotoolpara 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 xclippegar la ruta editada + Enter, tenemos una solución de trabajo !

En la práctica

  1. Estamos en una carpeta, abierta desde un enlace ("Enlace a Telegram") en mi escritorio. La carpeta real es una subcarpeta de mi Downloadscarpeta:

    ingrese la descripción de la imagen aquí

  2. Luego, si hacemos clic derecho en cualquiera de los archivos dentro de la carpeta para ejecutar el script:

    ingrese la descripción de la imagen aquí

  3. Automáticamente, se inserta la ruta al directorio superior:

    ingrese la descripción de la imagen aquí

  4. Y, también automáticamente, Returnse presiona, y subimos un nivel de directorio hacia arriba:

    ingrese la descripción de la imagen aquí

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

  1. El script necesita ambos xdotooly xclip:

    sudo apt-get install xdotool xclip
    
  2. crear, si aún no existe, el directorio

    ~/.local/share/nautilus/scripts
    
  3. Copie el script anterior en un archivo vacío, guárdelo como level_up(sin extensión) ~/.local/share/nautilus/scriptsy hágalo ejecutable

  4. Puede que tenga que cerrar sesión y volver a iniciarla.
  5. Ahora debería poder ejecutar el script haciendo clic derecho en un archivo (cualquiera)> scripts> level_up:

    ingrese la descripción de la imagen aquí


[ EDITAR ] Cambié el script anterior para pegar la ruta en la nautilusventana, en lugar de xdotool escribirlo . Se needs xclipinstalará, 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 .desktoparchivos 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)

ingrese la descripción de la imagen aquí

A diferencia de los enlaces simbólicos, estos enlaces lo llevarán a la carpeta real, sin comportarse como una carpeta en sí:

ingrese la descripción de la imagen aquí

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

  1. Copie el script en un archivo vacío, guárdelo como make_link(sin extensión) ~/.local/share/nautilus/scriptsy hágalo ejecutable
  2. Use el script seleccionándolo como una opción de clic derecho como en la primera imagen. Se .desktopcreará 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:

ingrese la descripción de la imagen aquí

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

  1. Para esta solución, ambos xclipy xdotoolDeben estar en su sistema.

    sudo apt-get install xdodool xclip
    
  2. Copie el script en un archivo vacío, guárdelo como level_up.py(en cualquier lugar).

  3. 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 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 xclippara 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.

Jacob Vlijm
fuente
3

O para Ubuntu 14.04, nautilus 3.10-1, con el xdotool paquete agregado, solo use lo siguiente en su .local/share/nautilus/scripts/updirtree archivo:

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

La cita final solo debe contener una nueva línea o return ( 0x0a). El pwdde dentro Nautilus produce un resultado diferente que cuando se ejecuta desde una fiesta / Terminal - devuelve la ruta real, no el camino a través del enlace.


Estoy de acuerdo en que no tiene sentido, es indocumentado y ni siquiera puedo entender qué tipo de entorno de ejecución ejecuta el código (no puedo encontrar ningún shell que produzca ese resultado), pero funciona. Es un truco, por eso incluí la versión de nautilus. ¿Quién sabe cuánto tiempo funcionará? Podría romperse en la próxima actualización de nautilus (o el intérprete desconocido), pero para mí, funciona en enlaces a ubicaciones montadas, enlaces a lugares en el árbol de directorios o simplemente ubicaciones simples en el árbol de directorios.

ubfan1
fuente
Yo uso Ubuntu 15.10 ... ¿Puede funcionar, tal vez en un código similar?
JohnDoea
1
Esto no tiene sentido, $(pwd)es el directorio de trabajo del shell , no de nautilus . Ver help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm
@benos confirmo, funciona en 15.10
user.dz
@JacobVlijm, funciona bien, me parece razonable, nautilus ejecuta scripts en el directorio actual.
user.dz
1
También @Sneetsher para mi sorpresa, funciona. Sin embargo, tiene un problema de tiempo cuando se usa en rutas muy largas. Tendrás que establecer un descanso, dependiendo de la longitud del camino. Otros caminos mecanografiados parecen estar rotos. Al principio, lo arreglé con un corte (arbitrario). En la última versión, hice xclip pegar la ruta, que no está sujeta a la longitud de la ruta.
Jacob Vlijm
2

Una solución limpia pero necesita reconstrucción de origen al revertir esta confirmación :

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);
        }

Instrucciones de construcción:

  1. Fuente de descarga:

    apt-get source nautilus
    
  2. Descargar dependencias de compilación

    sudo apt-get build-dep nautilus
    
  3. Realice la modificación necesaria desde el parche anterior

    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. Construir e instalarlo

    autoreconf
    ./configure
    make
    

    Para probar sin instalación

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

    Para instalarlo

    sudo make install
    

Esto hará que Nautilus resuelva los enlaces en su ruta de destino. Por cierto, esto se informó como error hace algún tiempo. Si cree que esta es una característica, envíe otro informe de error, solicitando un interruptor de configuración o un acceso directo específico para ello.

Referencia: ¿Cómo puedo evitar que Nautilus desreferencia los enlaces simbólicos? [cerrado]

user.dz
fuente
Un problema podría ser que necesita fijar la versión actual de nautilus o repetir el procedimiento después de cada actualización.
Jacob Vlijm
1
@JacobVlijm, sí, será así si construyo el paquete deb. Pero no lo hice, se instalará /usr/local/bin/, por lo que el sistema siempre ejecutará la copia modificada, como se indica en$PATH
user.dz