Nautilus: Odwiedziłem katalog przez dowiązanie symboliczne, teraz nie mogę przejść o jeden poziom wyżej w hierarchii katalogu docelowego

14

Skrót utworzyłem za pomocą opcji „make link”. Kiedy wchodzę do folderu tego skrótu, nie widzę żadnych folderów nad nim, więc nie mogę łatwo do niego nawigować.

Czy istnieje sposób, aby przejść o jeden folder w górę w GUI? Może skrót? (Nie można tego zrobić cd ..^ __ ^).

wprowadź opis zdjęcia tutaj


Na przykład w systemie Windows rzeczywiście jestem w stanie nawigować w sposób, który opisuję, oto obraz Win10, który to wyjaśnia:

wprowadź opis zdjęcia tutaj

JohnDoea
źródło
Czy wypróbowałeś klawisz Backspace?
PenguinCSC
W nautilusie mniejszym niż 3.16 łatwo jest dodać przycisk rodzica do paska narzędzi nautilus, choć należy to zrobić poprzez źródło> przebuduj (łatka lub kompilacja ppa dla 14.04 dostępne) W przeciwnym razie spróbujAlt+up key
doug
Alt + Up przenosi mnie z miejsca docelowego linku na pulpit ... Więc niestety: \ Jeśli ktoś tutaj ma odpowiednie połączenia, może zaoferować to bezpośrednio zespołowi deweloperów? Mam bardzo nowe, więc nie mogę zaoferować tego bezpośrednio, bez danych musiałbym przejść przez wiele osób (tak sądzę) ...
JohnDoea
Ach - Rozumiem, co masz na myśli. Może wypróbuj rozwiązanie Jacoba lub sam stwórz linki. Twoje bieżące linki są widoczne jako katalog, więc katalog to reż. link znajduje się, zazwyczaj na pulpicie. Jeśli tworzysz łącza przy użyciu wykonywalnego pliku .desktop, nawigacja po użyciu tego „łącza” będzie normalna.
doug
To samo pytanie tutaj askubuntu.com/questions/713397/show-full-path-for-links (jeśli rozwiązane, aby oznaczyć inne jako duplikat)
user.dz

Odpowiedzi:

17

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 -llinku, 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 nautilusskrypcie, 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 xdotooldo 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 xclipwkleić edytowaną ścieżkę + Enter, mamy działające rozwiązanie !

W praktyce

  1. Jesteśmy w folderze otwartym z linku („Link do telegramu”) na moim pulpicie. Prawdziwy folder jest sub mojego Downloadsfolderu:

    wprowadź opis zdjęcia tutaj

  2. Następnie kliknij prawym przyciskiem myszy dowolny plik w folderze, aby uruchomić skrypt:

    wprowadź opis zdjęcia tutaj

  3. Automatycznie wstawiana jest ścieżka do katalogu nadrzędnego:

    wprowadź opis zdjęcia tutaj

  4. I również automatycznie Returnjest naciskany, i przenosimy o jeden poziom wyżej:

    wprowadź opis zdjęcia tutaj

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ć

  1. Skrypt potrzebuje zarówno xdotoola xclip:

    sudo apt-get install xdotool xclip
    
  2. utwórz, jeśli jeszcze nie istnieje, katalog

    ~/.local/share/nautilus/scripts
    
  3. Skopiuj powyższy skrypt do pustego pliku, zapisz go jako level_up(bez rozszerzenia) ~/.local/share/nautilus/scriptsi włącz

  4. Może być konieczne wylogowanie się i ponowne zalogowanie.
  5. Teraz powinieneś być w stanie uruchomić skrypt, klikając prawym przyciskiem myszy plik (dowolny)> skrypty> poziom_up:

    wprowadź opis zdjęcia tutaj


[ EDYCJA ] Zmieniłem powyższy skrypt, aby wkleić ścieżkę do nautilusokna, zamiast xdotool pisać . Ma needs xclipbyć 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, .desktoppomocny 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)

wprowadź opis zdjęcia tutaj

W przeciwieństwie do dowiązań symbolicznych, linki te prowadzą do rzeczywistego folderu, nie zachowując się jak sam folder:

wprowadź opis zdjęcia tutaj

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ć

  1. Skopiuj skrypt do pustego pliku, zapisz go jako make_link(bez rozszerzenia) ~/.local/share/nautilus/scriptsi włącz
  2. Użyj skryptu, wybierając go jako opcję kliknięcia prawym przyciskiem myszy, jak na pierwszym obrazku. Plik wykonywalny .desktopzostanie 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/iconsposzukiwaniu „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:

wprowadź opis zdjęcia tutaj

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ć

  1. W przypadku tego rozwiązania zarówno xclipi xdotoolmusi być w systemie.

    sudo apt-get install xdodool xclip
    
  2. Skopiuj skrypt do pustego pliku i zapisz go jako level_up.py(gdziekolwiek).

  3. 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 xclipdo 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.

Jacob Vlijm
źródło
3

Lub w przypadku Ubuntu 14.04, nautilus 3.10-1, z xdotooldodanym pakietem, po prostu użyj następujących .local/share/nautilus/scripts/updirtree plików:

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

Ostateczny cytat powinien zawierać po prostu nowy wiersz lub return ( 0x0a). Z pwdnautilus daje inny wynik niż podczas uruchamiania z bash / terminalu - zwraca rzeczywistą ścieżkę, a nie ścieżkę używającą łącza.


Zgadzam się, że to nie ma sensu, jest nieudokumentowane i nawet nie mogę dowiedzieć się, jakie środowisko wykonawcze uruchamia kod (nie mogę znaleźć powłoki, która daje taki wynik), ale działa. To hack, dlatego dołączyłem wersję nautilusa. Kto wie, jak długo to będzie działać? Może się zepsuć przy następnej aktualizacji nautilusa (lub nieznanego interpretera), ale dla mnie działa on na linki do zamontowanych lokalizacji, linki do miejsc w drzewie katalogów lub po prostu zwykłe lokalizacje w drzewie katalogów.

ubfan1
źródło
Używam Ubuntu 15.10 ... Czy to może działać, może w podobnym kodzie?
JohnDoea,
1
To nie ma sensu, $(pwd)jest to katalog roboczy powłoki , a nie nautilus . Zobacz help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm
@benos Potwierdzam, że działa w 15.10
user.dz
@JacobVlijm, działa dobrze, wydaje mi się rozsądne, nautilus uruchamia skrypty w bieżącym katalogu.
user.dz
1
Ku mojemu zaskoczeniu @Sneetsher to działa. Masz jednak problem z czasem, jeśli używasz go na bardzo długich ścieżkach. Musisz wtedy ustawić przerwę, w zależności od długości ścieżki. W innym przypadku ścieżki wydawane są uszkodzone. Na początku naprawiłem to (dowolną) przerwą. W najnowszej wersji xclip wkleiłem ścieżkę, która nie zależy od długości ścieżki.
Jacob Vlijm
2

Czysta poprawka, ale wymaga przebudowania źródła przez cofnięcie tego zatwierdzenia :

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

Instrukcje budowania:

  1. Pobierz źródło:

    apt-get source nautilus
    
  2. Pobierz zależności kompilacji

    sudo apt-get build-dep nautilus
    
  3. Dokonaj potrzebnej modyfikacji z powyższej łatki

    Edytować 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. Zbuduj i zainstaluj

    autoreconf
    ./configure
    make
    

    Aby przetestować bez instalacji

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

    Aby go zainstalować

    sudo make install
    

To sprawi, że Nautilus rozpozna linki na swojej ścieżce docelowej. BTW, jakiś czas temu został zgłoszony jako błąd. Jeśli uważasz, że jest to funkcja, prześlij kolejny raport o błędzie, prosząc o ustawienie przełącznika lub określonego skrótu.

Odniesienie: Jak mogę powstrzymać Nautilusa przed dereferencją dowiązań symbolicznych? [Zamknięte]

user.dz
źródło
Problemem może być to, że albo musisz przypiąć aktualną wersję nautilusa, albo powtórzyć procedurę po każdej aktualizacji.
Jacob Vlijm
1
@JacobVlijm, tak będzie, jeśli zbuduję pakiet deb. Ale nie zrobiłem tego, zostanie zainstalowany /usr/local/bin/, więc system zawsze będzie uruchamiał zmodyfikowaną kopię, zgodnie z listą$PATH
user.dz.