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 nautilus
Skript 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 xdotool
dann 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 xclip
fügen Sie anschließend den bearbeiteten Pfad + ein Enter. Wir haben eine funktionierende Lösung !
In der Praxis
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 Downloads
Ordners:
Klicken Sie dann mit der rechten Maustaste auf eine der Dateien im Ordner , um das Skript auszuführen:
Automatisch wird der Pfad zum übergeordneten Verzeichnis eingefügt:
Und auch automatisch Return gedrückt, und wir rücken eine Verzeichnisebene nach oben:
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
Das Skript benötigt beides xdotool
und xclip
:
sudo apt-get install xdotool xclip
Erstellen Sie das Verzeichnis, falls es noch nicht existiert
~/.local/share/nautilus/scripts
Kopieren Sie das Skript oben in eine leere Datei, speichern Sie es als level_up
(ohne Erweiterung) in ~/.local/share/nautilus/scripts
und machen Sie es ausführbar
- Möglicherweise müssen Sie sich abmelden und wieder anmelden.
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:
[ EDIT ] änderte ich das Skript oben fügen Sie den Pfad in das nautilus
Fenster, anstatt, xdotool
Typ es. Es needs
xclip
muss 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).
Im Gegensatz zu Symlinks werden Sie mit diesen Links zum eigentlichen Ordner geführt, ohne sich wie ein Ordner zu verhalten:
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
- Kopieren Sie das Skript in eine leere Datei, speichern Sie es unter
make_link
(ohne Erweiterung) ~/.local/share/nautilus/scripts
und machen Sie es ausführbar
- Verwenden Sie das Skript, indem Sie es wie im ersten Bild als Rechtsklickoption auswählen. Eine ausführbare
.desktop
Datei 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/icons
nach "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:
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
Für diese Lösung müssen beide xclip
und xdotool
auf Ihrem System vorhanden sein.
sudo apt-get install xdodool xclip
Kopieren Sie das Skript in eine leere Datei und speichern Sie es als level_up.py
(irgendwo).
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 xclip
den 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.