Nautilus: Direktori yang dikunjungi melalui symlink, sekarang saya tidak bisa naik satu tingkat dalam hierarki direktori target

14

Saya membuat pintasan melalui opsi "buat tautan". Ketika saya masuk ke folder cara pintas ini, saya tidak bisa melihat folder di atasnya jadi saya tidak bisa menavigasi dengan mudah ke sana.

Apakah ada cara untuk membuka satu folder di GUI? Mungkin hotkey? (Tidak dapat melakukannya cd ..saat ini ^ __ ^).

masukkan deskripsi gambar di sini


Di Windows misalnya saya memang bisa menavigasi dengan cara yang saya jelaskan, berikut adalah gambar Win10 yang menjelaskannya:

masukkan deskripsi gambar di sini

JohnDoea
sumber
Sudahkah Anda mencoba kunci Backspace?
PenguinCSC
Dalam nautilus kurang dari 3,16 mudah untuk menambahkan tombol induk ke nautilus toolbar meskipun harus dilakukan melalui sumber> membangun kembali (patch atau ppa build untuk 14,04 tersedia) Jika tidak cobaAlt+up key
doug
Alt + Up membawa saya dari tujuan tautan ke desktop ... Jadi sayangnya tidak: \ Jika seseorang di sini memiliki koneksi yang tepat, ia mungkin menawarkan ini langsung ke tim pengembang? Saya sangat baru jadi saya tidak bisa menawarkannya secara langsung, tanpa data harus melewati banyak orang (saya kira) ...
JohnDoea
Ah - saya mengerti maksud Anda. Mungkin coba solusi Jacob atau buat tautan sendiri. Tautan Anda saat ini dilihat sebagai direktori sehingga dir adalah dir. tautan ada di, biasanya Desktop. Jika Anda membuat tautan menggunakan file .desktop yang dapat dieksekusi, navigasi setelah menggunakan 'tautan' itu akan normal.
doug
Pertanyaan yang sama di sini askubuntu.com/questions/713397/show-full-path-for-links (jika dipecahkan, untuk menandai yang lain sebagai duplikat)
user.dz

Jawaban:

17

Mengapa ini pertanyaan yang menantang

Pertanyaannya memiliki beberapa tantangan:

  • nautilus tidak berkomunikasi langsung dari baris perintah, untuk mendapatkan direktori yang sedang aktif misalnya, Anda juga tidak dapat "mengirim" folder yang sedang dibuka (-window) ke direktori lain dari baris perintah.
  • Di jalur saat ini, seperti yang diminta melalui "NAUTILUS_SCRIPT_CURRENT_URI", Nautilus tidak mengembalikan jalur nyata ke folder saat ini, tetapi "melihat" tautan seolah-olah itu adalah folder yang sebenarnya.

Karena itu solusinya kotor seperti yang didapat; kita perlu mencari solusi. Di bawah empat opsi untuk mengatasi masalah ini.

1. klik kanan untuk naik satu tingkat

Untuk mendapatkan jalur nyata ke direktori saat ini, kita harus mengambil informasi dari tautan. Kita dapat melakukannya dengan menggunakan ls -lpada tautan, yang akan menampilkan misalnya:

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

di mana bagian sesudahnya ->adalah jalur nyata di dalam symlink, atau, menggunakan python:

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

Dengan menggunakan ini dalam nautilusskrip, kita secara tidak langsung bisa mendapatkan jalur nyata ke file atau folder saat ini.

Lalu jika kita memiliki jalan, bagaimana kita membuat nautilus naik satu tingkat ke atas?

Sekali lagi, kita tidak bisa menyelesaikan ini dan menjaga tangan kita tetap bersih. Untuk naik satu tingkat, pertama-tama kita mengedit sedikit path yang ditemukan, dari:

/path/to/a/folder

ke

/path/to/a

kemudian, gunakan xdotooluntuk mensimulasikan Ctrl+ L(pintasan GUI untuk menyisipkan jalur ke jendela nautilus, karena tidak ada opsi cli untuk pindah ke direktori lain menggunakan jendela saat ini ), dan kemudian membuat xcliptempel jalur yang diedit + Enter, kami memiliki solusi yang berfungsi !

Dalam praktek

  1. Kami berada di folder, dibuka dari tautan ("Tautan ke Telegram") di Desktop saya. The nyata folder adalah sub folder dari saya Downloadsfolder:

    masukkan deskripsi gambar di sini

  2. Lalu jika kita klik kanan pada salah satu file di dalam folder untuk menjalankan skrip:

    masukkan deskripsi gambar di sini

  3. Secara otomatis, jalur ke direktori superior dimasukkan:

    masukkan deskripsi gambar di sini

  4. Dan, juga secara otomatis, Returnditekan, dan kami memindahkan satu level direktori ke atas:

    masukkan deskripsi gambar di sini

Naskah

#!/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")

Cara mengatur

  1. Script membutuhkan keduanya xdotooldan xclip:

    sudo apt-get install xdotool xclip
    
  2. buat, jika belum ada, direktori

    ~/.local/share/nautilus/scripts
    
  3. Salin skrip di atas ke dalam file kosong, simpan sebagai level_up(tanpa ekstensi) ~/.local/share/nautilus/scripts, dan buat agar dapat dieksekusi

  4. Anda mungkin harus keluar dan kembali.
  5. Sekarang Anda harus dapat menjalankan skrip dengan mengklik kanan pada file (apa saja)> skrip> level_up:

    masukkan deskripsi gambar di sini


[ EDIT ] Saya mengubah skrip di atas untuk menempelkan path ke nautilusjendela, alih-alih xdotool mengetiknya . Itu needs xclipharus diinstal, tetapi ini merupakan peningkatan besar, terutama pada jalur yang sangat panjang.


2. Atau, buka jendela nautilus baru di direktori superior

Anda dapat menghindari penggunaan xdotool, dengan membuat skrip membuka jendela nautilus baru , di direktori induk. Script akan lebih pendek:

#!/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])

Dalam hal ini, Anda tidak perlu menginstal xdotool. Kami bahkan dapat memperluas skrip dengan menutup jendela asli dan menempatkan jendela baru tepat di posisi yang sama (& ukuran).

Kelemahannya adalah bahwa sejarah jendela asli hilang dengan cara ini.

3. Solusi tambahan: cara alternatif untuk (secara otomatis) membuat tautan

Tidak relevan dengan tautan yang ada, tetapi ketika digunakan dari GUI, skrip nautilus untuk secara otomatis membuat .desktopfile yang dapat dieksekusi pada klik kanan mungkin bermanfaat:

klik kanan pada direktori untuk membuat pintasan (bertindak sebagai tautan)

masukkan deskripsi gambar di sini

Tidak seperti symlink, tautan ini akan membawa Anda ke folder yang sebenarnya, tanpa berperilaku sebagai folder itu sendiri:

masukkan deskripsi gambar di sini

Naskah

#!/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])

Cara Penggunaan

  1. Salin skrip ke file kosong, simpan sebagai make_link(tanpa ekstensi) ~/.local/share/nautilus/scripts, dan buat itu dapat dieksekusi
  2. Gunakan skrip dengan memilihnya sebagai opsi klik kanan seperti pada gambar pertama. File yang dapat dieksekusi .desktopakan dibuat di direktori yang sama, pindahkan ke tempat lain jika perlu; jalur tertaut adalah absolut.

Beri tautan ikon pembeda

Anda bisa memberi tautan alternatif ikon yang membedakan. Jika Anda mencari di dalam /usr/share/iconsfolder "folder", banyak pilihan yang valid muncul.

Jika dalam skrip, baris "Icon=folder",diganti oleh Icon=stock_folder-copy,(gunakan nama ikon tanpa ekstensi), hasilnya pada sistem saya adalah:

masukkan deskripsi gambar di sini

Tentu saja Anda dapat menggunakan ikon khusus Anda sendiri juga, tetapi jika Anda menggunakan jalur lengkap (jangan gunakan ~), Anda harus menyertakan ekstensi ikon itu.

4. Pindah ke direktori superior dengan tombol pintasan

Mungkin opsi yang paling nyaman; dengan jendela nautilus di depan, tekan tombol pintas untuk memindahkan satu direktori ke atas.

Naskah

#!/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")

Menggunakan

  1. Untuk solusi ini, keduanya xclipdan xdotoolPerlu berada di sistem Anda.

    sudo apt-get install xdodool xclip
    
  2. Salin skrip ke file kosong, simpan sebagai level_up.py(di mana saja).

  3. Tambahkan ke tombol cara pintas: pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus". Klik "+" dan tambahkan perintah:

    python3 /path/to/level_up.py
    

NB Opsi pintasan agak terbatas dalam hal ini, karena skrip itu sendiri akan mensimulasikanCtrl+L, danCtrl+Alt+Lakan membuat Anda keluar ...Ctrl+\bekerja dengan baik pada sistem saya.

Penjelasan

Skrip ini juga mensimulasikan Ctrl+ L, tetapi alih-alih menggunakan nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI", skrip ini digunakan xclipuntuk menyalin jalur yang dipilih secara otomatis di jendela nautilus. Seperti opsi 1, skrip kemudian menghitung jalur nyata dan mendapatkan direktori superior.

Opsi ini mungkin berguna jika Anda lebih suka papan ketik menggunakan klik kanan.

Yakub Vlijm
sumber
3

Atau untuk Ubuntu 14.04, nautilus 3.10-1, dengan xdotoolpaket yang ditambahkan, cukup gunakan yang berikut ini di .local/share/nautilus/scripts/updirtree file Anda :

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

Kutipan terakhir seharusnya hanya berisi baris baru atau return ( 0x0a). The pwdfrom dalam nautilus menghasilkan hasil yang berbeda dari ketika dijalankan dari bash / terminal - ia mengembalikan jalur yang sebenarnya, bukan jalur yang menggunakan tautan.


Saya setuju itu tidak masuk akal, itu tidak berdokumen, dan saya bahkan tidak bisa mengetahui seperti apa lingkungan eksekusi yang menjalankan kode (saya tidak dapat menemukan shell yang menghasilkan hasil itu), tetapi ia bekerja. Ini adalah retasan, itulah sebabnya saya memasukkan versi nautilus. Siapa yang tahu berapa lama itu akan bekerja? Mungkin pecah pada peningkatan nautilus berikutnya (atau juru bahasa tidak dikenal), tetapi bagi saya, ini berfungsi pada tautan ke lokasi yang dipasang, tautan ke tempat-tempat di pohon direktori, atau hanya lokasi sederhana di pohon direktori.

ubfan1
sumber
Saya menggunakan Ubuntu 15.10 ... Bisakah ini bekerja, mungkin dalam kode yang sama?
JohnDoea
1
Ini tidak masuk akal, $(pwd)adalah direktori kerja shell , bukan nautilus . Lihat help.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm
@benos Saya konfirmasi, itu berfungsi di 15.10
user.dz
@ JacobVlijm, Ini berfungsi dengan baik, menurut saya masuk akal, nautilus menjalankan skrip di direktori saat ini.
user.dz
1
Juga @Sneetsher mengejutkan saya, itu berhasil. Namun Anda memiliki masalah waktu ketika digunakan pada jalur yang sangat panjang. Anda harus mengatur istirahat, tergantung pada panjang jalan. Jalur yang diketik lain tampaknya rusak. Pada awalnya, saya memperbaikinya dengan istirahat (sewenang-wenang), Pada versi terbaru, saya membuat xclip tempel path, yang tidak tergantung pada panjang path.
Jacob Vlijm
2

Perbaikan bersih tetapi membutuhkan sumber untuk membangun kembali dengan mengembalikan komit ini :

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

Membangun instruksi:

  1. Sumber unduhan:

    apt-get source nautilus
    
  2. Unduh dependensi build

    sudo apt-get build-dep nautilus
    
  3. Buat modifikasi dari tambalan di atas

    Edit 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. Bangun & pasang

    autoreconf
    ./configure
    make
    

    Untuk menguji tanpa instalasi

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

    Untuk menginstalnya

    sudo make install
    

Ini akan membuat nautilus menyelesaikan tautan ke jalur target mereka. BTW, ini dilaporkan sebagai bug beberapa waktu lalu. Jika Anda pikir ini adalah fitur maka kirimkan laporan bug lain, meminta sakelar pengaturan atau pintasan spesifik untuknya.

Referensi: Bagaimana saya bisa menghentikan Nautilus dari symlink dereferencing? [Tutup]

user.dz
sumber
Masalahnya adalah Anda harus menyematkan versi nautilus saat ini, atau ulangi prosedur setelah setiap pembaruan.
Jacob Vlijm
1
@ JacobVlijm, ya itu akan jadi jika saya membangun paket deb. Tapi saya tidak melakukannya, itu akan diinstal /usr/local/bin/, jadi sistem akan selalu menjalankan salinan yang dimodifikasi, seperti yang terdaftar di$PATH
user.dz