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

14

Ich habe eine Verknüpfung über die "make link" -Option 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? (% Co_de% diesmal nicht möglich ^ __ ^).

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

    
JohnDoea 13.01.2016, 07:02
quelle

3 Antworten

16

Warum ist das eine herausfordernde Frage?

Die Frage hat einige Herausforderungen:

  • nautilus kommuniziert nicht direkt über die Befehlszeile, um beispielsweise das aktuell aktive Verzeichnis zu erhalten, noch kann der aktuell geöffnete Ordner (-window) über die Befehlszeile an ein anderes Verzeichnis "gesendet" werden.
  • Im aktuellen Pfad, wie von "NAUTILUS_SCRIPT_CURRENT_URI" angefordert, gibt Nautilus den echten Pfad nicht an den 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 Workarounds finden. Unter vier Optionen, um das Problem zu lösen.

1. Rechtsklicken, um eine Ebene höher zu gehen

Um den echten Pfad zum aktuellen Verzeichnis zu erhalten, müssen wir Informationen aus dem Link abrufen. Das können wir tun, indem wir ls -l für den Link verwenden, der zB:

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

Dabei ist der Abschnitt nach -> der echte Pfad innerhalb des Symlinks oder mit python :

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

Wenn wir dies in einem nautilus -Skript verwenden, können wir indirekt den echten Pfad zur aktuellen Datei oder zum aktuellen Ordner erhalten.

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

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

/path/to/a/folder

in

/path/to/a

Verwenden Sie dann xdotool , um Strg + L zu simulieren (die GUI-Verknüpfung zum Einfügen eines Pfades in ein Nautilus-Fenster, da es keine CLI-Option zum Verschieben gibt ein anderes Verzeichnis mit dem aktuellen Fenster ), und machen Sie xclip den bearbeiteten Pfad einfügen + Geben Sie , 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. Der Ordner real ist ein Unterordner meines Downloads -Ordners:

  2. Wenn wir dann mit der rechten Maustaste auf any der Dateien im Ordner klicken, um das Skript auszuführen:

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

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

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")

So richten Sie

ein
  1. Das Skript benötigt sowohl xdotool als auch xclip :

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

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

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

[ BEARBEITEN ] Ich habe das obige Skript in eingefügt geändert, um den Pfad in das Fenster nautilus einzufügen, anstatt xdotool type zu machen es. Es ist needs xclip zu installieren, 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önnten die Verwendung von xdotool vermeiden, indem Sie das Skript dazu veranlassen, ein neues Nautilus-Fenster im übergeordneten Verzeichnis 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üssen Sie xdotool nicht installieren. Wir könnten das Skript sogar erweitern, indem wir das ursprüngliche Fenster schließen und das neue Fenster genau an der gleichen Position (& amp; size) 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 zum (automatischen) Erstellen von Links

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

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

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

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 als make_link (keine Erweiterung) in ~/.local/share/nautilus/scripts und machen Sie es ausführbar
  2. Verwenden Sie das Skript, indem Sie es wie im ersten Bild mit der rechten Maustaste auswählen. Eine ausführbare .desktop -Datei wird im selben Verzeichnis erstellt, verschieben Sie sie gegebenenfalls an anderer Stelle; Der verlinkte Pfad ist absolut.

Geben Sie dem Link ein unterscheidendes Symbol

Sie könnten dem alternativen Link ein unterscheidendes Symbol geben. Wenn Sie im Verzeichnis /usr/share/icons nach "Ordner" suchen, werden zahlreiche gültige Optionen angezeigt.

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

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

4. Wechseln Sie mit einem Tastenkü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")

Um

zu verwenden
  1. Für diese Lösung müssen sowohl xclip als auch xdotool auf Ihrem System vorhanden sein.

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

  3. Fügen Sie es einer Tastenkombination hinzu: Wählen Sie: Systemeinstellungen & gt; "Tastatur" & gt; "Verknüpfungen" & gt; "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/level_up.py
    

NB Die Verknüpfungsoptionen sind in diesem Fall etwas eingeschränkt, da das Skript selbst Strg simuliert + L und Strg + Alt + L bewirkt, dass Sie sich abmelden ... Strg + \ hat auf meinem System funktioniert.

Erklärung

Dieses Skript simuliert auch Ctrl + L , aber anstatt nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI" zu verwenden, verwendet es 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 kann nützlich sein, wenn Sie die Tastatur der rechten Maustaste vorziehen.

    
Jacob Vlijm 15.01.2016, 22:06
quelle
3

Oder verwenden Sie für Ubuntu 14.04, nautilus 3.10-1 mit dem xdotool -Paket das folgende 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 von innerhalb von 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.

    
ubfan1 18.01.2016 17:20
quelle
2

Eine saubere Lösung, aber die Quelle muss wiederhergestellt werden, indem this commit :

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

Build Anweisungen:

  1. Downloadquelle:

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

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

    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. Bauen & amp; installiere es

    autoreconf
    ./configure
    make
    

    Um ohne Installation zu testen

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

    Um es zu installieren

    sudo make install
    

Dadurch wird Nautilus die Links in ihren Zielpfad auflösen. Übrigens wurde dies vor einiger Zeit als Bug gemeldet. Wenn Sie denken, dass dies eine Funktion ist, reichen Sie einen anderen Fehlerbericht ein, in dem Sie nach einem Schalter oder einer spezifischen Verknüpfung dafür gefragt werden.

Referenz: Wie kann ich anhalten? Nautilus von Dereferenzierung Symlinks? [geschlossen]

    
user.dz 16.01.2016 16:28
quelle

Tags und Links