Dlaczego jest to trudne pytanie
Pytanie ma kilka wyzwań:
nautilus
nie komunikuje się bezpośrednio z wiersza poleceń, na przykład w celu uzyskania aktualnie aktywnego katalogu, ani nie można „wysłać” aktualnie otwartego folderu (-window) do innego katalogu z wiersza poleceń.
- W bieżącej ścieżce, zgodnie z żądaniem przesłanym przez
"NAUTILUS_SCRIPT_CURRENT_URI"
, Nautilus nie zwraca prawdziwej ścieżki do bieżącego folderu, ale „widzi” link tak, jakby był to folder rzeczywisty.
Rozwiązanie jest zatem tak brudne, jak tylko się da; musimy znaleźć obejścia. Poniżej cztery opcje rozwiązania problemu.
1. kliknij prawym przyciskiem myszy, aby przejść o jeden poziom wyżej
Aby uzyskać prawdziwą ścieżkę do bieżącego katalogu, musimy pobrać informacje z linku. Możemy to zrobić za pomocą ls -l
linku, który wyświetli np .:
lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current
gdzie sekcja po ->
jest prawdziwą ścieżką wewnątrz dowiązania symbolicznego lub, używając python
:
real = os.path.realpath("/path")
Używając tego w nautilus
skrypcie, możemy pośrednio uzyskać rzeczywistą ścieżkę do bieżącego pliku lub folderu.
Zatem jeśli mamy ścieżkę, jak sprawić, by łodzik przesunął się o jeden poziom wyżej?
Ponownie nie możemy rozwiązać tego problemu i utrzymujemy ręce w czystości. Aby przejść o jeden poziom wyżej, najpierw trochę edytujemy znalezioną ścieżkę, z:
/path/to/a/folder
w
/path/to/a
następnie, używając xdotool
do symulacji Ctrl+ L(skrót GUI do wstawienia ścieżki do okna nautilus, ponieważ nie ma opcji cli, aby przejść do innego katalogu przy użyciu bieżącego okna ), a następnie xclip
wkleić edytowaną ścieżkę + Enter, mamy działające rozwiązanie !
W praktyce
Jesteśmy w folderze otwartym z linku („Link do telegramu”) na moim pulpicie. Prawdziwy folder jest sub mojego Downloads
folderu:
Następnie kliknij prawym przyciskiem myszy dowolny plik w folderze, aby uruchomić skrypt:
Automatycznie wstawiana jest ścieżka do katalogu nadrzędnego:
I również automatycznie Returnjest naciskany, i przenosimy o jeden poziom wyżej:
Scenariusz
#!/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")
Jak skonfigurować
Skrypt potrzebuje zarówno xdotool
a xclip
:
sudo apt-get install xdotool xclip
utwórz, jeśli jeszcze nie istnieje, katalog
~/.local/share/nautilus/scripts
Skopiuj powyższy skrypt do pustego pliku, zapisz go jako level_up
(bez rozszerzenia) ~/.local/share/nautilus/scripts
i włącz
- Może być konieczne wylogowanie się i ponowne zalogowanie.
Teraz powinieneś być w stanie uruchomić skrypt, klikając prawym przyciskiem myszy plik (dowolny)> skrypty> poziom_up:
[ EDYCJA ] Zmieniłem powyższy skrypt, aby wkleić ścieżkę do nautilus
okna, zamiast xdotool
pisać . Ma needs
xclip
być zainstalowany, ale jest to znaczna poprawa, szczególnie na bardzo długich ścieżkach.
2. Alternatywnie otwórz nowe okno nautilus w katalogu nadrzędnym
Ty mógł unikać xdotool
, poprzez skrypt otworzyć nowe okno Nautilus, w katalogu rodzica. Skrypt byłby wtedy jeszcze krótszy:
#!/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])
W takim przypadku nie trzeba instalować xdotool
. Możemy nawet rozszerzyć skrypt, zamykając oryginalne okno i umieszczając nowe okno dokładnie w tej samej pozycji (i rozmiarze).
Minusem jest to, że historia oryginalnego okna jest w ten sposób zagubiona.
3. Dodatkowe rozwiązanie: alternatywny sposób (automatycznego) tworzenia linków
Nie dotyczy istniejących łączy, ale gdy jest używany z GUI, .desktop
pomocny może być skrypt nautilus do automatycznego tworzenia plików wykonywalnych po kliknięciu prawym przyciskiem:
kliknij katalog prawym przyciskiem myszy, aby utworzyć skrót (zachowując się jak łącze)
W przeciwieństwie do dowiązań symbolicznych, linki te prowadzą do rzeczywistego folderu, nie zachowując się jak sam folder:
Scenariusz
#!/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])
Jak używać
- Skopiuj skrypt do pustego pliku, zapisz go jako
make_link
(bez rozszerzenia) ~/.local/share/nautilus/scripts
i włącz
- Użyj skryptu, wybierając go jako opcję kliknięcia prawym przyciskiem myszy, jak na pierwszym obrazku. Plik wykonywalny
.desktop
zostanie utworzony w tym samym katalogu, w razie potrzeby przenieś go w inne miejsce; połączona ścieżka jest absolutna.
Nadaj linkowi ikonę wyróżniającą
Alternatywnemu linkowi możesz nadać ikonę wyróżniającą. Jeśli przeszukujesz katalog w /usr/share/icons
poszukiwaniu „folderu”, pojawi się wiele ważnych opcji.
Jeśli w skrypcie wiersz "Icon=folder",
zostanie zastąpiony przez Icon=stock_folder-copy,
(użyj nazwy ikony bez rozszerzenia), wynik w moim systemie to:
Oczywiście możesz również użyć własnej ikony niestandardowej, ale jeśli używasz pełnych ścieżek (nie używaj ~
), powinieneś dołączyć rozszerzenie ikony.
4. Przejdź do katalogu nadrzędnego za pomocą klawisza skrótu
Prawdopodobnie najwygodniejsza opcja; z oknem nautilus z przodu naciśnij klawisz skrótu, aby przejść o jeden katalog w górę.
Scenariusz
#!/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")
Używać
W przypadku tego rozwiązania zarówno xclip
i xdotool
musi być w systemie.
sudo apt-get install xdodool xclip
Skopiuj skrypt do pustego pliku i zapisz go jako level_up.py
(gdziekolwiek).
Dodaj go do klawisza skrótu: wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:
python3 /path/to/level_up.py
Uwaga: Opcje skrótów są w tym przypadku nieco ograniczone, ponieważ sam skryptbędzie symulowałCtrl+L, aCtrl+Alt+Lspowoduje wylogowanie ...Ctrl+\działało dobrze w moim systemie.
Wyjaśnienie
Ten skrypt również symuluje Ctrl+ L, ale zamiast używać nautilusa "NAUTILUS_SCRIPT_CURRENT_URI"
, używa xclip
do skopiowania automatycznie wybranej ścieżki w oknie nautilusa. Podobnie jak opcja 1, skrypt oblicza prawdziwą ścieżkę i wyprowadza katalog nadrzędny.
Ta opcja może być przydatna, jeśli wolisz klawiaturę niż kliknięcie prawym przyciskiem myszy.