Nautilus: Besuchtes Verzeichnis über Symlink, jetzt kann ich in der Zielverzeichnis-Hierarchie keine Ebene höher gehen

14

Ich habe eine Verknüpfung über die Option "Verknüpfung erstellen" erstellt. Wenn ich in den Ordner dieser Verknüpfung gehe, werden keine Ordner darüber angezeigt, sodass ich nicht einfach zu ihnen navigieren kann.

Gibt es eine Möglichkeit, einen Ordner in der Benutzeroberfläche nach oben zu verschieben? Vielleicht ein Hotkey? (Kann cd ..diesmal nicht machen ^ __ ^).

Bildbeschreibung hier eingeben


In Windows kann ich in der Tat so navigieren, wie ich es beschreibe. Hier ist ein Win10-Image, das es erklärt:

Bildbeschreibung hier eingeben

JohnDoea
quelle
Haben Sie die Rücktaste ausprobiert?
PenguinCSC
In nautilus weniger als 3,16 ist es einfach , eine übergeordnete Schaltfläche nautilus Symbolleiste hinzufügen , obwohl über die Quelle getan werden muss> Wiederaufbau (Patch oder ein ppa Build für 14,04 verfügbar) Ansonsten versuchenAlt+up key
doug
Alt + Up bringt mich vom Ziel des Links zum Desktop ... Also leider nein: Wenn jemand hier die richtigen Verbindungen hat, kann er dies direkt dem Entwicklerteam anbieten? Ich bin sehr neu, daher kann ich es nicht direkt anbieten, ohne dass die Daten durch viele Leute gehen müssen (denke ich) ...
JohnDoea
Ah, ich verstehe, was du meinst. Versuchen Sie es mit Jacobs Lösung oder erstellen Sie selbst Links. Ihre aktuellen Links werden als Verzeichnis angesehen, also ist das Verzeichnis oben. Der Link befindet sich in der Regel auf dem Desktop. Wenn Sie Links mit einer ausführbaren .desktop-Datei erstellen, ist die Navigation nach Verwendung dieses Links normal.
Doug
Dieselbe Frage hier askubuntu.com/questions/713397/show-full-path-for-links (falls gelöst, um andere als Duplikat zu markieren)
user.dz

Antworten:

17

Warum ist das eine herausfordernde Frage?

Die Frage hat einige Herausforderungen:

  • nautilus kommuniziert nicht direkt über die Befehlszeile, um beispielsweise das aktuell aktive Verzeichnis abzurufen, und Sie können den aktuell geöffneten Ordner (-Fenster) auch nicht über die Befehlszeile an ein anderes Verzeichnis "senden".
  • Im aktuellen Pfad gibt "NAUTILUS_SCRIPT_CURRENT_URI"Nautilus , wie über angefordert , nicht den tatsächlichen Pfad zum aktuellen Ordner zurück, sondern "sieht" den Link so, als wäre es ein tatsächlicher Ordner.

Die Lösung ist daher so schmutzig wie es nur geht. Wir müssen Problemumgehungen finden. Nachfolgend vier Möglichkeiten zur Behebung des Problems.

1. Klicken Sie mit der rechten Maustaste, um eine Ebene nach oben zu gelangen

Um den tatsächlichen Pfad zum aktuellen Verzeichnis zu ermitteln, müssen Informationen über den Link abgerufen werden. Wir können dies entweder ls -lüber den Link tun , der zB folgendes ausgibt:

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

wobei der nachfolgende Abschnitt ->der tatsächliche Pfad innerhalb des Symlinks ist, oder mit python:

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

Wenn Sie dies in einem nautilusSkript verwenden, können Sie indirekt den tatsächlichen Pfad zur aktuellen Datei oder zum aktuellen Ordner ermitteln.

Wenn wir dann den Weg haben, wie bringen wir Nautilus dazu, sich eine Ebene nach oben zu bewegen?

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

/path/to/a/folder

in

/path/to/a

Verwenden Sie xdotooldann Ctrl+ , um zu simulieren L(die GUI-Verknüpfung zum Einfügen eines Pfads in ein Nautilus-Fenster, da es keine CLI-Option gibt, um mit dem aktuellen Fenster in ein anderes Verzeichnis zu wechseln ), und xclipfügen Sie anschließend den bearbeiteten Pfad + ein Enter. Wir haben eine funktionierende Lösung !

In der Praxis

  1. Wir befinden uns in einem Ordner, der über einen Link ("Link to Telegram") auf meinem Desktop geöffnet wurde. Das echte Ordner ist ein Unterordner meines DownloadsOrdners:

    Bildbeschreibung hier eingeben

  2. Klicken Sie dann mit der rechten Maustaste auf eine der Dateien im Ordner , um das Skript auszuführen:

    Bildbeschreibung hier eingeben

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

    Bildbeschreibung hier eingeben

  4. Und auch automatisch Return gedrückt, und wir rücken eine Verzeichnisebene nach oben:

    Bildbeschreibung hier eingeben

Das Drehbuch

#!/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 xdotoolund xclip:

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

    ~/.local/share/nautilus/scripts
    
  3. Kopieren Sie das Skript oben in eine leere Datei, speichern Sie es als level_up(ohne Erweiterung) in ~/.local/share/nautilus/scriptsund machen Sie es ausführbar

  4. Möglicherweise müssen Sie sich abmelden und wieder anmelden.
  5. Jetzt sollten Sie in der Lage sein, das Skript auszuführen, indem Sie mit der rechten Maustaste auf eine Datei (eine beliebige)> Skripte> level_up klicken:

    Bildbeschreibung hier eingeben


[ EDIT ] änderte ich das Skript oben fügen Sie den Pfad in das nautilusFenster, anstatt, xdotool Typ es. Es needs xclipmuss installiert werden, ist aber eine große Verbesserung, insbesondere auf sehr langen Wegen.


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

Sie könnten die Verwendung vermeiden xdotool, indem Sie das Skript dazu bringen, ein neues Nautilus-Fenster im Verzeichnis des übergeordneten Elements zu öffnen . 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üssten 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 derselben 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, Links (automatisch) zu erstellen

Nicht relevant für vorhandene Links, aber bei Verwendung über die GUI ein Nautilus-Skript zum automatischen Erstellen einer ausführbaren Datei .desktop Dateien beim Klicken mit der rechten Maustaste hilfreich sein:

Klicken Sie mit der rechten Maustaste auf das Verzeichnis, um eine Verknüpfung zu erstellen (als Link verhalten).

Bildbeschreibung hier eingeben

Im Gegensatz zu Symlinks werden Sie mit diesen Links zum eigentlichen Ordner geführt, ohne sich wie ein Ordner zu verhalten:

Bildbeschreibung hier eingeben

Das Drehbuch

#!/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(ohne Erweiterung) ~/.local/share/nautilus/scriptsund machen Sie es ausführbar
  2. Verwenden Sie das Skript, indem Sie es wie im ersten Bild als Rechtsklickoption auswählen. Eine ausführbare .desktopDatei wird im selben Verzeichnis erstellt. Verschieben Sie sie gegebenenfalls an einen anderen Ort. Der verknüpfte Pfad ist absolut.

Geben Sie dem Link ein Erkennungszeichen

Sie können dem alternativen Link ein Unterscheidungssymbol geben. Wenn Sie im Verzeichnis /usr/share/iconsnach "Ordner" suchen , werden zahlreiche gültige Optionen angezeigt.

Wenn im Skript die Zeile "Icon=folder",durch ersetzt wird Icon=stock_folder-copy,(verwenden Sie den Symbolnamen ohne Erweiterung), lautet das Ergebnis auf meinem System:

Bildbeschreibung hier eingeben

Natürlich können Sie auch Ihr eigenes benutzerdefiniertes Symbol verwenden, aber wenn Sie vollständige Pfade verwenden (nicht verwenden ~), sollten Sie dies tun die Erweiterung des Symbols einschließen.

4. Wechseln Sie mit einer Tastenkombination in das übergeordnete Verzeichnis

Wahrscheinlich die bequemste Option; Drücken Sie bei geöffnetem Nautilus-Fenster eine Tastenkombination, um ein Verzeichnis nach oben zu verschieben.

Das Drehbuch

#!/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 müssen beide xclipund xdotoolauf Ihrem System vorhanden sein.

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

  3. Hinzufügen zu einer Tastenkombination: 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 Verknüpfung Optionen sind ein bisschen in diesem Fall begrenzt, da das Skript selbst simuliertCtrl+LundCtrl+Alt+Lwerden Sie aus machen einloggen ...Ctrl+\ auf meinem System einwandfrei funktioniert haben.

Erläuterung

Dieses Skript simuliert auch Ctrl+ L, sondern nautilus der Verwendung "NAUTILUS_SCRIPT_CURRENT_URI", verwendet er xclipden automatisch ausgewählten Pfad im Nautilus - Fenster zu kopieren. Wie bei Option 1 berechnet das Skript dann den tatsächlichen Pfad und leitet das übergeordnete Verzeichnis ab.

Diese Option kann hilfreich sein, wenn Sie die Tastatur für die Verwendung von Rechtsklick bevorzugen.

Jacob Vlijm
quelle
3

Oder für Ubuntu 14.04, Nautilus 3.10-1, mit dem xdotoolhinzugefügten Paket, verwenden Sie einfach Folgendes in Ihrer .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 endgültige Zitat sollte nur einen Zeilenumbruch oder return ( 0x0a) enthalten. Der pwdNautilus aus dem Inneren erzeugt ein anderes Ergebnis als wenn er von einem Bash / Terminal ausgeführt wird - er gibt den tatsächlichen Pfad zurück, nicht den Pfad, der den Link verwendet.


Ich bin damit einverstanden, dass es keinen Sinn ergibt, dass es undokumentiert ist und ich nicht einmal herausfinden kann, in welcher Ausführungsumgebung der Code ausgeführt wird (ich kann keine Shell finden, die dieses Ergebnis erzeugt), aber es funktioniert. Es ist ein Hack, weshalb ich die Version von Nautilus aufgenommen habe. Wer weiß, wie lange es funktionieren wird? Könnte beim nächsten Nautilus-Upgrade (oder dem unbekannten Interpreter) unterbrochen werden, aber für mich funktioniert es mit Links zu bereitgestellten Speicherorten, Links zu Speicherorten im Verzeichnisbaum oder nur einfachen Speicherorten im Verzeichnisbaum.

ubfan1
quelle
Ich benutze Ubuntu 15.10 ... Kann es funktionieren, vielleicht in einem ähnlichen Code?
JohnDoea
1
Das macht keinen Sinn, $(pwd)ist das Arbeitsverzeichnis der Shell , nicht von Nautilus . Siehe 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
1
Auch @Sneetsher zu meiner Überraschung funktioniert es. Bei Verwendung auf sehr langen Wegen tritt jedoch ein Zeitproblem auf. In diesem Fall müssen Sie je nach Länge des Pfades eine Unterbrechung festlegen. Andernfalls scheinen die eingegebenen Pfade unterbrochen zu sein. Zuerst habe ich es mit einer (willkürlichen) Unterbrechung behoben. In der neuesten Version habe ich den Pfad xclip eingefügt , der nicht der Länge des Pfads unterliegt.
Jacob Vlijm
2

Ein sauberer Fix, der jedoch neu erstellt werden muss, indem dieses Commit zurückgesetzt wird :

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. Nehmen Sie die erforderlichen Änderungen am obigen Patch vor

    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
    

    Zum Testen ohne Installation

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

    Um es zu installieren

    sudo make install
    

Dadurch werden die Links von Nautilus in ihren Zielpfad aufgelöst. Übrigens wurde dies vor einiger Zeit als Bug gemeldet. Wenn Sie der Meinung sind, dass dies eine Funktion ist, senden Sie einen weiteren Fehlerbericht, in dem Sie aufgefordert werden, den Schalter oder eine bestimmte Verknüpfung dafür festzulegen.

Referenz: Wie kann ich verhindern, dass Nautilus Symlinks dereferenziert? [geschlossen]

user.dz
quelle
Ein Problem kann sein, dass Sie entweder die aktuelle Version von nautilus anheften oder den Vorgang nach jedem Update wiederholen müssen.
Jacob Vlijm
1
@JacobVlijm, yep das wird so sein, wenn ich das deb-Paket baue. Aber ich habe es nicht getan, es wird installiert /usr/local/bin/, so dass das System immer die geänderte Kopie $PATH
ausführt