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 -l
pada 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 nautilus
skrip, 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 xdotool
untuk 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 xclip
tempel jalur yang diedit + Enter, kami memiliki solusi yang berfungsi !
Dalam praktek
Kami berada di folder, dibuka dari tautan ("Tautan ke Telegram") di Desktop saya. The nyata folder adalah sub folder dari saya Downloads
folder:
Lalu jika kita klik kanan pada salah satu file di dalam folder untuk menjalankan skrip:
Secara otomatis, jalur ke direktori superior dimasukkan:
Dan, juga secara otomatis, Returnditekan, dan kami memindahkan satu level direktori ke atas:
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
Script membutuhkan keduanya xdotool
dan xclip
:
sudo apt-get install xdotool xclip
buat, jika belum ada, direktori
~/.local/share/nautilus/scripts
Salin skrip di atas ke dalam file kosong, simpan sebagai level_up
(tanpa ekstensi) ~/.local/share/nautilus/scripts
, dan buat agar dapat dieksekusi
- Anda mungkin harus keluar dan kembali.
Sekarang Anda harus dapat menjalankan skrip dengan mengklik kanan pada file (apa saja)> skrip> level_up:
[ EDIT ] Saya mengubah skrip di atas untuk menempelkan path ke nautilus
jendela, alih-alih xdotool
mengetiknya . Itu needs
xclip
harus 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 .desktop
file yang dapat dieksekusi pada klik kanan mungkin bermanfaat:
klik kanan pada direktori untuk membuat pintasan (bertindak sebagai tautan)
Tidak seperti symlink, tautan ini akan membawa Anda ke folder yang sebenarnya, tanpa berperilaku sebagai folder itu sendiri:
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
- Salin skrip ke file kosong, simpan sebagai
make_link
(tanpa ekstensi) ~/.local/share/nautilus/scripts
, dan buat itu dapat dieksekusi
- Gunakan skrip dengan memilihnya sebagai opsi klik kanan seperti pada gambar pertama. File yang dapat dieksekusi
.desktop
akan 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/icons
folder "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:
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
Untuk solusi ini, keduanya xclip
dan xdotool
Perlu berada di sistem Anda.
sudo apt-get install xdodool xclip
Salin skrip ke file kosong, simpan sebagai level_up.py
(di mana saja).
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 xclip
untuk 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.