ทำไมนี่เป็นคำถามที่ท้าทาย
คำถามมีความท้าทายเล็กน้อย:
nautilus
ไม่สื่อสารโดยตรงจากบรรทัดคำสั่งเพื่อรับไดเรกทอรีที่ใช้งานอยู่ในปัจจุบันเช่นและคุณไม่สามารถ "ส่ง" โฟลเดอร์ที่เปิดอยู่ในปัจจุบัน (- เรียกใช้) ไปยังไดเรกทอรีอื่นจากบรรทัดคำสั่ง
- ในเส้นทางปัจจุบันตามที่ร้องขอผ่านทาง
"NAUTILUS_SCRIPT_CURRENT_URI"
Nautilus จะไม่คืนค่าเส้นทางจริงไปยังโฟลเดอร์ปัจจุบัน แต่ "เห็น" ลิงก์ราวกับว่ามันเป็นโฟลเดอร์จริง
วิธีแก้ปัญหาจึงสกปรกตามที่ได้รับ เราต้องหาวิธีแก้ปัญหา ด้านล่างสี่ตัวเลือกในการแก้ปัญหา
1. คลิกขวาเพื่อเลื่อนขึ้นหนึ่งระดับ
เพื่อให้ได้เส้นทางที่แท้จริงไปยังไดเรกทอรีปัจจุบันเราต้องดึงข้อมูลจากลิงค์ เราสามารถทำได้ทั้งโดยการใช้ls -l
ลิงค์ซึ่งจะออกเช่น:
lrwxrwxrwx 1 jacob jacob 35 jan 15 08:23 /home/jacob/Bureaublad/Flyer_st/Verwijzing naar Site_current -> /home/jacob/Bureaublad/Site_current
โดยที่ส่วนหลัง->
คือเส้นทางที่แท้จริงภายใน symlink หรือโดยใช้python
:
real = os.path.realpath("/path")
ใช้สิ่งนี้ในnautilus
สคริปต์เราสามารถรับเส้นทางที่แท้จริงไปยังไฟล์หรือโฟลเดอร์ปัจจุบัน
ถ้าเรามีเส้นทางเราจะทำให้หอยโข่งเลื่อนระดับหนึ่งขึ้นไปได้อย่างไร
อีกครั้งเราไม่สามารถแก้ปัญหานี้และรักษามือของเราให้สะอาด หากต้องการเลื่อนระดับหนึ่งขึ้นไปเราจะแก้ไขพา ธ ที่ค้นพบเล็กน้อยจาก:
/path/to/a/folder
เข้าไป
/path/to/a
จากนั้นใช้xdotool
เพื่อจำลองCtrl+ L(ช็อตคัต GUI เพื่อแทรกเส้นทางลงในหน้าต่าง nautilus เนื่องจากไม่มีตัวเลือก cli ที่จะย้ายไปยังไดเรกทอรีอื่นโดยใช้หน้าต่างปัจจุบัน ) จากนั้นทำการxclip
วางเส้นทางที่แก้ไข + Enterเรามีวิธีแก้ไข !
ในทางปฏิบัติ
เราอยู่ในโฟลเดอร์ที่เปิดจากลิงค์ ("ลิงก์ไปยังโทรเลข") บนเดสก์ท็อปของฉัน จริงโฟลเดอร์เป็นโฟลเดอร์ย่อยของฉันDownloads
โฟลเดอร์:
ถ้าเราคลิกขวาที่ไฟล์ใด ๆในโฟลเดอร์เพื่อเรียกใช้สคริปต์:
โดยอัตโนมัติจะแทรกเส้นทางไปยังไดเรกทอรีที่เหนือกว่า:
และจะReturnถูกกดโดยอัตโนมัติและเราก็เลื่อนระดับไดเรกทอรีขึ้นหนึ่งระดับ
บท
#!/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")
วิธีการตั้งค่า
สคริปต์ต้องการทั้งxdotool
และxclip
:
sudo apt-get install xdotool xclip
สร้างถ้าไม่มีอยู่แล้วไดเรกทอรี
~/.local/share/nautilus/scripts
คัดลอกสคริปต์ด้านบนลงในไฟล์เปล่าบันทึกเป็นlevel_up
(ไม่มีส่วนขยาย) ใน~/.local/share/nautilus/scripts
และทำให้สามารถเรียกใช้งานได้
- คุณอาจต้องออกจากระบบและกลับเข้ามาใหม่
ตอนนี้คุณควรจะสามารถเรียกใช้สคริปต์โดยคลิกขวาที่ไฟล์ (ใด ๆ )> script> level_up:
[ แก้ไข ] ฉันเปลี่ยนสคริปต์ด้านบนเพื่อวางเส้นทางลงในnautilus
หน้าต่างแทนที่จะxdotool
พิมพ์มัน มันneeds
xclip
จะติดตั้ง แต่มันคือการปรับปรุงที่สำคัญโดยเฉพาะอย่างยิ่งในเส้นทางที่ยาวมาก
2. อีกวิธีหนึ่งคือเปิดหน้าต่าง nautilus ใหม่ในไดเรกทอรี superior
คุณสามารถหลีกเลี่ยงการใช้xdotool
งานโดยทำให้สคริปต์เปิดหน้าต่าง nautilus ใหม่ในไดเรกทอรีของผู้ปกครอง จากนั้นสคริปต์จะสั้นลง:
#!/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])
xdotool
ในกรณีนี้คุณจะไม่จำเป็นต้องติดตั้ง เราสามารถขยายสคริปต์ได้ด้วยการปิดหน้าต่างต้นฉบับและวางหน้าต่างใหม่ในตำแหน่งเดียวกัน (& ขนาด)
ข้อเสียคือประวัติของหน้าต่างต้นฉบับจะหายไปด้วยวิธีนี้
3. โซลูชันเพิ่มเติม: ทางเลือกในการสร้างลิงก์ (โดยอัตโนมัติ)
ไม่เกี่ยวข้องกับลิงค์ที่มีอยู่ แต่เมื่อใช้จาก GUI สคริปต์ nautilus เพื่อสร้าง.desktop
ไฟล์ปฏิบัติการโดยอัตโนมัติเมื่อคลิกขวาอาจมีประโยชน์:
คลิกขวาที่ไดเรกทอรีเพื่อสร้างทางลัด (ทำงานเป็นลิงก์)
แตกต่างจาก symlink ลิงก์เหล่านี้จะนำคุณไปยังโฟลเดอร์จริงโดยไม่ต้องทำตัวเหมือนเป็นตัวโฟลเดอร์เอง:
บท
#!/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])
วิธีใช้
- คัดลอกสคริปต์ลงในไฟล์ว่างเปล่าบันทึกเป็น
make_link
(ไม่มีส่วนขยาย) ~/.local/share/nautilus/scripts
และทำให้สามารถเรียกใช้งานได้
- ใช้สคริปต์โดยเลือกเป็นตัวเลือกคลิกขวาเหมือนในภาพแรก
.desktop
ไฟล์ปฏิบัติการจะถูกสร้างขึ้นในไดเรกทอรีเดียวกันย้ายไปที่อื่นหากคุณต้องการ เส้นทางที่เชื่อมโยงนั้นแน่นอน
ให้ลิงก์เป็นไอคอนพิเศษ
คุณสามารถให้ลิงค์ที่แตกต่างเป็นไอคอนแยก หากคุณค้นหาใน/usr/share/icons
"โฟลเดอร์" ในไดเรกทอรีตัวเลือกที่ใช้ได้จะปรากฏขึ้น
หากในสคริปต์บรรทัด"Icon=folder",
จะถูกแทนที่ด้วยIcon=stock_folder-copy,
(ใช้ชื่อไอคอนโดยไม่มีส่วนขยาย) ผลลัพธ์ในระบบของฉันคือ:
แน่นอนว่าคุณสามารถใช้ไอคอนที่กำหนดเองของคุณเองได้เช่นกัน แต่ถ้าคุณใช้เส้นทางแบบเต็ม (ห้ามใช้~
) คุณควรรวมส่วนขยายของไอคอนไว้ด้วย
4. ย้ายไปยังไดเรกทอรีที่เหนือกว่าด้วยปุ่มทางลัด
อาจเป็นตัวเลือกที่สะดวกที่สุด; ด้วยหน้าต่างหอยโข่งด้านหน้าให้กดปุ่มทางลัดเพื่อย้ายหนึ่งไดเรกทอรีขึ้น
บท
#!/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")
ใช้
สำหรับวิธีนี้ทั้งคู่xclip
และxdotool
จำเป็นต้องอยู่ในระบบของคุณ
sudo apt-get install xdodool xclip
คัดลอกสคริปต์ไปยังไฟล์เปล่าบันทึกเป็นlevel_up.py
(ที่ใดก็ได้)
เพิ่มลงในคีย์ลัด: เลือก: การตั้งค่าระบบ> "คีย์บอร์ด"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:
python3 /path/to/level_up.py
NBลัดตัวเลือกเป็นบิต จำกัด ในกรณีนี้ตั้งแต่สคริปต์ที่ตัวเองจะจำลองCtrl+LและCtrl+Alt+Lจะทำให้คุณออกจากระบบ ...Ctrl+\ทำงานได้ดีในระบบของฉัน
คำอธิบาย
สคริปต์นี้ยังจำลองCtrl+ Lแต่แทนที่จะใช้ nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI"
จะใช้xclip
เพื่อคัดลอกเส้นทางที่เลือกโดยอัตโนมัติในหน้าต่าง nautilus เช่นเดียวกับตัวเลือกที่ 1 สคริปต์จะคำนวณเส้นทางที่แท้จริงและรับไดเรกทอรีที่เหนือกว่า
ตัวเลือกนี้อาจมีประโยชน์หากคุณต้องการให้แป้นพิมพ์ใช้การคลิกขวา