Frage Nautilus: Besuchte Verzeichnis über Symlink, jetzt kann ich nicht eine Ebene höher in der Zielverzeichnishierarchie gehen


Ich habe eine Verknüpfung über die Option "make link" erstellt. Wenn ich in den Ordner dieser Verknüpfung gehe, kann ich keine Ordner darüber sehen, so dass ich nicht einfach zu ihnen navigieren kann.

Gibt es eine Möglichkeit, einen Ordner in der GUI zu öffnen? Vielleicht ein Hotkey? (Kann nicht tun cd .. dieses Mal ^ __ ^).

enter image description here


In Windows zum Beispiel kann ich tatsächlich so navigieren, wie ich es beschreibe, hier ist ein Win10-Bild, das es erklärt:

enter image description here


14
2018-01-13 06:02


Ursprung


Hast du die Rücktaste versucht? - PenguinCSC
In Nautilus weniger als 3,16 ist es einfach, einen Eltern-Button zur Nautilus-Symbolleiste hinzuzufügen, obwohl dies über die Quelle> Rebuild (Patch oder ein PPA-Build für 14.04 verfügbar) erfolgen muss Alt+up key - doug
Alt + Hoch bringt mich vom Ziel des Links zum Desktop ... So traurig nein: \ Wenn jemand hier die richtigen Verbindungen hat, könnte er dies direkt dem Entwicklerteam anbieten? Ich habe es sehr neu, also kann ich es nicht direkt anbieten, ohne dass die Daten durch viele Leute gehen müssen (schätze ich) ... - JohnDoea
Ah - ich verstehe was du meinst. Vielleicht versuchen Sie Jacobs Lösung oder erstellen Sie selbst Links. Ihre aktuellen Links werden als Verzeichnis angesehen, also ist up das Verzeichnis. Der Link ist in der Regel der Desktop. Wenn Sie Links mit einer ausführbaren .desktop-Datei erstellen, ist die Navigation nach der Verwendung dieses "Links" normal. - doug
Die gleiche Frage hier askubuntu.com/questions/713397/show-full-path-for-links (falls gelöst, um andere als doppelt zu markieren) - user.dz


Antworten:


Warum ist das eine herausfordernde Frage?

Die Frage hat einige Herausforderungen:

  • nautilus kommuniziert nicht direkt von der Befehlszeile aus, um beispielsweise das aktuell aktive Verzeichnis zu erhalten, noch können Sie den aktuell geöffneten Ordner (-window) über die Befehlszeile an ein anderes Verzeichnis senden.
  • Im aktuellen Pfad, wie über "NAUTILUS_SCRIPT_CURRENT_URI", Nautilus gibt das nicht zurück echt Pfad zum aktuellen Ordner, aber "sieht" den Link, als wäre es ein tatsächlicher Ordner.

Die Lösung ist daher so schmutzig wie es nur geht; Wir müssen Workarounds finden. Unter vier Optionen, um das Problem zu lösen.

1. Klicken Sie mit der rechten Maustaste, um eine Ebene höher zu gehen

Um das zu bekommen echt Pfad zum aktuellen Verzeichnis müssen wir Informationen aus dem Link abrufen. Wir können das entweder mit Hilfe von ls -l auf der Verbindung, die Ausgabe z.

lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current

wo der Abschnitt nach -> ist der echt Pfad innerhalb des Symlinks oder unter Verwendung von python:

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

Verwenden Sie dies in einem nautilus Skript, können wir indirekt das bekommen echt Pfad zur aktuellen Datei oder zum aktuellen Ordner.

Wenn wir dann den Pfad haben, wie bringen wir Nautilus dazu, sich eine Ebene höher zu bewegen?

Auch das können wir nicht lösen und Halte unsere Hände sauber. Um eine Ebene nach oben zu gehen, bearbeiten wir zuerst den gefundenen Pfad ein wenig, von:

/path/to/a/folder

in

/path/to/a

dann, mit xdotool simulieren Strg+L (die GUI-Verknüpfung zum Einfügen eines Pfades in ein Nautilus-Fenster, da es keine CLI-Option zum Verschieben in ein anderes Verzeichnis gibt Verwenden des aktuellen Fensters), und anschließend machen xclip Fügen Sie den bearbeiteten Pfad + ein EingebenWir haben eine funktionierende Lösung!

In der Praxis

  1. Wir sind in einem Ordner, geöffnet von einem Link ("Link to Telegram") auf meinem Desktop. Das echt Ordner ist ein Unterordner von meinem Downloads Mappe:

    enter image description here

  2. Dann, wenn wir mit der rechten Maustaste klicken irgendein der Dateien in dem Ordner, in dem das Skript ausgeführt werden soll:

    enter image description here

  3. Automatisch wird der Pfad zum übergeordneten Verzeichnis eingefügt:

    enter image description here

  4. Und auch automatisch Rückkehr wird gedrückt, und wir verschieben eine Verzeichnisebene nach oben:

    enter image description here

Das Skript

#!/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")

Wie stellt man das ein

  1. Das Skript benötigt beides xdotool und xclip:

    sudo apt-get install xdotool xclip
    
  2. Erstellen Sie, wenn es noch nicht existiert, das Verzeichnis

    ~/.local/share/nautilus/scripts
    
  3. Kopiere das obige Skript in eine leere Datei und speichere es als level_up (keine Verlängerung) in ~/.local/share/nautilus/scripts, und Mach es ausführbar

  4. Sie müssen sich möglicherweise ab- und wieder anmelden.
  5. Jetzt sollten Sie in der Lage sein, das Skript mit der rechten Maustaste auszuführen in einer Datei(beliebig)> Skripte> level_up:

    enter image description here


[BEARBEITEN] Ich habe das obige Skript geändert auf Einfügen der Weg in die nautilus Fenster, anstatt zu machen xdotool  Art es. Es needs  xclip installiert werden, aber es ist eine große Verbesserung, besonders auf sehr langen Wegen.


2. Alternativ öffnen Sie ein neues Nautilus-Fenster im übergeordneten Verzeichnis

Sie könnte vermeide das Benutzen xdotool, indem Sie das Skript öffnen a Neu Nautilus-Fenster, im Elternverzeichnis. Das Skript wäre dann noch kürzer:

#!/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])

In diesem Fall müssen Sie nicht installieren xdotool. Wir könnten das Skript sogar erweitern, indem wir das ursprüngliche Fenster schließen und das neue Fenster genau an der gleichen Position (& Größe) platzieren.

Der Nachteil ist, dass die Geschichte des ursprünglichen Fensters auf diese Weise verloren geht.

3. Eine zusätzliche Lösung: Alternative Möglichkeit (automatisch) Links zu erstellen

Nicht relevant für vorhandene Links, aber wenn sie von der GUI verwendet werden, ein Nautilus-Skript, um automatisch ausführbare Dateien zu erstellen .desktop Dateien mit der rechten Maustaste könnten hilfreich sein:

Klicken Sie mit der rechten Maustaste auf das Verzeichnis, um eine Verknüpfung zu erstellen (verhält sich wie eine Verknüpfung)

enter image description here

Im Gegensatz zu Symlinks führen Sie diese Links zum eigentlichen Ordner, ohne sich selbst als Ordner zu verhalten:

enter image description here

Das Skript

#!/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])

Wie benutzt man

  1. Kopieren Sie das Skript in eine leere Datei, speichern Sie es unter make_link (keine Verlängerung) in ~/.local/share/nautilus/scripts, und Mach es ausführbar
  2. Verwenden Sie das Skript, indem Sie es wie im ersten Bild als Rechtsklickoption auswählen. Eine ausführbare Datei .desktop Die Datei wird im selben Verzeichnis erstellt und bei Bedarf an anderer Stelle verschoben. Der verlinkte Pfad ist absolut.

Geben Sie dem Link ein markantes Symbol

Sie könnten dem alternativen Link ein unterscheidendes Symbol geben. Wenn Sie innerhalb des Verzeichnisses suchen /usr/share/icons Für "Ordner" werden zahlreiche gültige Optionen angezeigt.

Wenn im Skript die Zeile steht "Icon=folder", wird ersetzt durch Icon=stock_folder-copy, (benutze den Icon-Namen ohne Erweiterung), das Ergebnis auf meinem System ist:

enter image description here

Natürlich können Sie auch Ihr eigenes benutzerdefiniertes Symbol verwenden, aber wenn Sie vollständige Pfade verwenden (nicht verwenden ~), Sie sollte Fügen Sie die Erweiterung des Symbols hinzu.

4. Wechseln Sie mit einem Tastaturkürzel in das übergeordnete Verzeichnis

Wahrscheinlich die bequemste Option; mit dem Nautilus-Fenster vor, drücken Sie eine Abkürzungstaste, um ein Verzeichnis nach oben zu bewegen.

Das Skript

#!/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")

Benutzen

  1. Für diese Lösung, beides xclip und xdotool Muss auf Ihrem System sein.

    sudo apt-get install xdodool xclip
    
  2. Kopieren Sie das Skript in eine leere Datei, speichern Sie es unter level_up.py (irgendwo).

  3. Fügen Sie es zu einer Tastenkombination hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/level_up.py
    

NB Die Shortcut-Optionen sind in diesem Fall ein wenig eingeschränkt, da das Skript selbst wird simulieren Strg+L, und Strg+Alt+L wird dich abmelden ... Strg+\ funktionierte gut auf meinem System.

Erläuterung

Dieses Skript simuliert auch Strg+L, aber anstatt Nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI", es benutzt xclip um den automatisch ausgewählten Pfad im Nautilus-Fenster zu kopieren. Wie Option 1 berechnet das Skript dann den tatsächlichen Pfad und leitet das übergeordnete Verzeichnis ab.

Diese Option ist möglicherweise nützlich, wenn Sie die Tastatur der rechten Maustaste vorziehen.


16
2018-01-15 21:06





Oder für Ubuntu 14.04, Nautilus 3.10-1, mit der xdotool Paket hinzugefügt, verwenden Sie einfach Folgendes in Ihrem .local/share/nautilus/scripts/updirtree Datei:

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

Das letzte Zitat sollte nur einen Zeilenumbruch oder eine Rückkehr enthalten (0x0a). Das pwd from nautilus erzeugt ein anderes Ergebnis als wenn es von einer bash / terminal ausgeführt wird - es gibt den tatsächlichen Pfad zurück, nicht den Pfad, der den Link verwendet.


Ich stimme zu, dass es keinen Sinn ergibt, es ist undokumentiert, und ich kann nicht einmal herausfinden, welche Art von Ausführungsumgebung den Code ausführt (ich kann keine Shell finden, die dieses Ergebnis erzeugt), aber es funktioniert. Es ist ein Hack, deshalb habe ich die Version von Nautilus aufgenommen. Wer weiß, wie lange es funktioniert? Könnte bei der nächsten Nautilus-Aktualisierung (oder dem unbekannten Interpreter) brechen, aber für mich funktioniert es bei Links zu gemounteten Orten, Links zu Orten in der Verzeichnisstruktur oder einfach Orten in der Verzeichnisstruktur.


3
2018-01-18 16:20



Ich benutze Ubuntu 15.10 ... Kann es funktionieren, vielleicht in einem ähnlichen Code? - JohnDoea
Das macht keinen Sinn, $(pwd) ist das Arbeitsverzeichnis des Schale, nicht von Nautilus. Sehen help.ubuntu.com/community/NautilusScriptsHowto - Jacob Vlijm
@benos Ich bestätige, es funktioniert in 15.10 - user.dz
@JacobVlijm, Es funktioniert gut, es scheint mir vernünftig, Nautilus führt Skripte im aktuellen Verzeichnis. - user.dz
Auch @Sneetsher zu meiner Überraschung funktioniert es. Sie haben jedoch ein Timing-Problem, wenn Sie auf sehr langen Pfaden verwendet werden. Sie müssen dann je nach Länge des Pfades eine Pause setzen. Andere getippte Pfade scheinen unterbrochen zu sein. Zuerst habe ich es mit einer (willkürlichen) Pause behoben, in der letzten Version habe ich gemacht xclip  Einfügender Pfad, der nicht der Länge des Pfades unterliegt. - Jacob Vlijm


Eine saubere Lösung, aber Wiederherstellung der Quelle durch Zurücksetzen das begehen:

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

Bauanleitung:

  1. Quelle herunterladen:

    apt-get source nautilus
    
  2. Laden Sie Build-Abhängigkeiten herunter

    sudo apt-get build-dep nautilus
    
  3. Machen Sie die Notwendigkeit Änderung von oben Patch

    Bearbeiten 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. Erstellen und installieren Sie es

    autoreconf
    ./configure
    make
    

    Um ohne Installation zu testen

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

    Um es zu installieren

    sudo make install
    

Dies führt dazu, dass Nautilus die Links in ihren Zielpfad auflöst. Übrigens wurde dies vor einiger Zeit als Bug gemeldet. Wenn Sie denken, dass dies eine Funktion ist, reichen Sie einen anderen Fehlerbericht ein und fragen Sie nach einem Schalter oder einer spezifischen Verknüpfung dafür.

Referenz:  Wie kann ich Nautilus davon abhalten, Symlinks zu dereferenzieren? [geschlossen]


2
2018-01-16 15:28



Ein Problem könnte sein, dass Sie entweder die aktuelle Version von Nautilus anheften müssen oder den Vorgang nach jedem Update wiederholen müssen. - Jacob Vlijm
@JacobVlijm, yep, das wird so sein, wenn ich das Deb-Paket baue. Aber ich habe es nicht, es wird installiert werden /usr/local/bin/, so wird das System immer die modifizierte Kopie ausführen, wie in $PATH - user.dz