Nautilus: ไดเรกทอรีที่เยี่ยมชมผ่าน symlink ตอนนี้ฉันไม่สามารถขึ้นไปหนึ่งระดับในลำดับชั้นไดเรกทอรีเป้าหมาย


14

ฉันสร้างทางลัดผ่านตัวเลือก "สร้างลิงก์" เมื่อฉันเข้าสู่โฟลเดอร์ทางลัดนี้ฉันไม่เห็นโฟลเดอร์ใด ๆ ด้านบนเลยฉันจึงไม่สามารถนำทางไปยังโฟลเดอร์เหล่านั้นได้อย่างง่ายดาย

มีวิธีไปหนึ่งโฟลเดอร์ใน GUI หรือไม่? อาจจะเป็นคีย์ลัด? (ไม่สามารถทำcd ..เวลานี้ได้ ^ __ ^)

ป้อนคำอธิบายรูปภาพที่นี่


ใน Windows ตัวอย่างเช่นฉันสามารถนำทางในแบบที่ฉันอธิบายนี่คือภาพ Win10 ที่อธิบาย:

ป้อนคำอธิบายรูปภาพที่นี่


คุณลองใช้ปุ่ม Backspace หรือไม่
PenguinCSC

ใน nautilus ที่น้อยกว่า 3.16 มันง่ายที่จะเพิ่มปุ่มพาเรนต์ลงใน nautilus toolbar แต่ต้องทำผ่าน source> rebuild (patch หรือ ppa build สำหรับ 14.04 available) มิฉะนั้นให้ลองAlt+up key
dang

Alt + Up นำฉันจากปลายทางของลิงก์ไปยังเดสก์ท็อป ... ดังนั้นน่าเศร้าที่: \ ถ้ามีใครบางคนที่มีการเชื่อมต่อที่ถูกต้องเขาอาจเสนอสิ่งนี้โดยตรงกับทีม dev? ฉันใหม่มากดังนั้นฉันจึงไม่สามารถให้ได้โดยตรงโดยไม่ต้องมีข้อมูลต้องผ่านหลาย ๆ คน (ฉันเดา) ...
JohnDoea

อ่า - ฉันเห็นสิ่งที่คุณหมายถึง อาจลองใช้โซลูชันของ Jacob หรือสร้างลิงก์ด้วยตัวคุณเอง ลิงค์ปัจจุบันของคุณถูกมองว่าเป็นไดเรกทอรีดังนั้น dir คือ ลิงก์อยู่ในปกติเดสก์ท็อป หากคุณสร้างลิงก์โดยใช้ไฟล์. desktop ที่สามารถเรียกใช้งานได้การนำทางหลังจากใช้ 'ลิงก์' นั้นจะเป็นเรื่องปกติ
ดั๊ก

คำถามเดียวกันที่นี่ askubuntu.com/questions/713397/show-full-path-for-links (ถ้าแก้ไขเพื่อทำเครื่องหมายอื่น ๆ ว่าซ้ำกัน)
user.dz

คำตอบ:


17

ทำไมนี่เป็นคำถามที่ท้าทาย

คำถามมีความท้าทายเล็กน้อย:

  • 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เรามีวิธีแก้ไข !

ในทางปฏิบัติ

  1. เราอยู่ในโฟลเดอร์ที่เปิดจากลิงค์ ("ลิงก์ไปยังโทรเลข") บนเดสก์ท็อปของฉัน จริงโฟลเดอร์เป็นโฟลเดอร์ย่อยของฉันDownloadsโฟลเดอร์:

    ป้อนคำอธิบายรูปภาพที่นี่

  2. ถ้าเราคลิกขวาที่ไฟล์ใด ๆในโฟลเดอร์เพื่อเรียกใช้สคริปต์:

    ป้อนคำอธิบายรูปภาพที่นี่

  3. โดยอัตโนมัติจะแทรกเส้นทางไปยังไดเรกทอรีที่เหนือกว่า:

    ป้อนคำอธิบายรูปภาพที่นี่

  4. และจะ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")

วิธีการตั้งค่า

  1. สคริปต์ต้องการทั้งxdotoolและxclip:

    sudo apt-get install xdotool xclip
    
  2. สร้างถ้าไม่มีอยู่แล้วไดเรกทอรี

    ~/.local/share/nautilus/scripts
    
  3. คัดลอกสคริปต์ด้านบนลงในไฟล์เปล่าบันทึกเป็นlevel_up(ไม่มีส่วนขยาย) ใน~/.local/share/nautilus/scriptsและทำให้สามารถเรียกใช้งานได้

  4. คุณอาจต้องออกจากระบบและกลับเข้ามาใหม่
  5. ตอนนี้คุณควรจะสามารถเรียกใช้สคริปต์โดยคลิกขวาที่ไฟล์ (ใด ๆ )> 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])

วิธีใช้

  1. คัดลอกสคริปต์ลงในไฟล์ว่างเปล่าบันทึกเป็นmake_link(ไม่มีส่วนขยาย) ~/.local/share/nautilus/scriptsและทำให้สามารถเรียกใช้งานได้
  2. ใช้สคริปต์โดยเลือกเป็นตัวเลือกคลิกขวาเหมือนในภาพแรก .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")

ใช้

  1. สำหรับวิธีนี้ทั้งคู่xclipและxdotoolจำเป็นต้องอยู่ในระบบของคุณ

    sudo apt-get install xdodool xclip
    
  2. คัดลอกสคริปต์ไปยังไฟล์เปล่าบันทึกเป็นlevel_up.py(ที่ใดก็ได้)

  3. เพิ่มลงในคีย์ลัด: เลือก: การตั้งค่าระบบ> "คีย์บอร์ด"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:

    python3 /path/to/level_up.py
    

NBลัดตัวเลือกเป็นบิต จำกัด ในกรณีนี้ตั้งแต่สคริปต์ที่ตัวเองจะจำลองCtrl+LและCtrl+Alt+Lจะทำให้คุณออกจากระบบ ...Ctrl+\ทำงานได้ดีในระบบของฉัน

คำอธิบาย

สคริปต์นี้ยังจำลองCtrl+ Lแต่แทนที่จะใช้ nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI"จะใช้xclipเพื่อคัดลอกเส้นทางที่เลือกโดยอัตโนมัติในหน้าต่าง nautilus เช่นเดียวกับตัวเลือกที่ 1 สคริปต์จะคำนวณเส้นทางที่แท้จริงและรับไดเรกทอรีที่เหนือกว่า

ตัวเลือกนี้อาจมีประโยชน์หากคุณต้องการให้แป้นพิมพ์ใช้การคลิกขวา


3

หรือสำหรับ Ubuntu 14.04, nautilus 3.10-1, เมื่อมีการxdotoolเพิ่มแพ็คเกจ, ให้ใช้สิ่งต่อไปนี้ใน.local/share/nautilus/scripts/updirtree ไฟล์ของคุณ:

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

คำพูดสุดท้ายควรมีการขึ้นบรรทัดใหม่หรือ return ( 0x0a) pwdจากภายในหอยโข่งผลิตผลที่แตกต่างกันกว่าเมื่อเรียกใช้จากทุบตี / ขั้ว - มันคืนเส้นทางที่เกิดขึ้นจริงไม่ได้ใช้เส้นทางการเชื่อมโยง


ฉันยอมรับว่ามันไม่มีเหตุผลมันไม่มีเอกสารและฉันไม่สามารถเข้าใจได้ว่าสภาพแวดล้อมการประมวลผลแบบใดที่เรียกใช้โค้ด (ฉันไม่สามารถหาเชลล์ที่สร้างผลลัพธ์นั้น) แต่ก็ใช้งานได้ มันเป็นแฮ็คซึ่งเป็นสาเหตุที่ฉันรวมรุ่นของหอยโข่ง ใครจะรู้ว่ามันจะใช้เวลานานเท่าไหร่ อาจแตกหักในการอัพเกรดหอยโข่งถัดไป (หรือล่ามที่ไม่รู้จัก) แต่สำหรับฉันมันทำงานบนลิงก์ไปยังตำแหน่งที่เมานต์ลิงก์ไปยังสถานที่ในไดเรคทอรีไดเรกทอรีหรือเพียงตำแหน่งธรรมดาในทรีไดเรกทอรี


ฉันใช้ Ubuntu 15.10 ... มันสามารถใช้งานได้อาจเป็นรหัสที่คล้ายกันหรือไม่
JohnDoea

1
นี้ทำให้รู้สึกไม่ $(pwd)เป็นไดเรกทอรีการทำงานของเปลือกไม่ใช่หอยโข่ง ดูhelp.ubuntu.com/community/NautilusScriptsHowto
Jacob Vlijm

@benos ฉันยืนยันมันใช้งานได้ใน 15.10
user.dz

@JacobVlijm มันทำงานได้ดีดูเหมือนว่าฉันสมเหตุสมผล nautilus เรียกใช้สคริปต์ในไดเรกทอรีปัจจุบัน
user.dz

1
@Sneetsher ด้วยความประหลาดใจของฉันมันใช้งานได้ คุณมีปัญหาเรื่องเวลาอย่างไรก็ตามเมื่อใช้กับเส้นทางที่ยาวมาก คุณจะต้องหยุดพักแล้วขึ้นอยู่กับความยาวของเส้นทาง เส้นทางที่พิมพ์อื่น ๆ ดูเหมือนจะเสียหาย ตอนแรกฉันแก้ไขด้วยตัวแบ่ง (โดยพลการ) ในเวอร์ชันล่าสุดฉันได้xclip วางเส้นทางซึ่งไม่มีความยาวของเส้นทาง
Jacob Vlijm

2

การแก้ไขใหม่ทั้งหมด แต่ต้องการสร้างใหม่โดยการคืนค่าการคอมมิทนี้ :

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

สร้างคำแนะนำ:

  1. แหล่งดาวน์โหลด:

    apt-get source nautilus
    
  2. ดาวน์โหลดการสร้างการอ้างอิง

    sudo apt-get build-dep nautilus
    
  3. ทำการเปลี่ยนแปลงที่จำเป็นจากแพตช์ด้านบน

    แก้ไข 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. สร้างและติดตั้ง

    autoreconf
    ./configure
    make
    

    เพื่อทดสอบโดยไม่ต้องติดตั้ง

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

    เพื่อทำการติดตั้ง

    sudo make install
    

นี่จะทำให้หอยโข่งแก้ไขลิงก์ในเส้นทางเป้าหมายของมัน BTW นี้ถูกรายงานว่าเป็นข้อบกพร่องมาแล้ว หากคุณคิดว่านี่เป็นคุณสมบัติให้ส่งรายงานข้อผิดพลาดอื่นโดยขอให้ตั้งค่าสวิตช์หรือทางลัดเฉพาะ

การอ้างอิง: ฉันจะหยุด Nautilus ไม่ให้เชื่อมโยงการลงทะเบียน symlink ได้อย่างไร [ปิด]


ปัญหาอาจเป็นได้ว่าคุณต้องตรึง nautilus เวอร์ชันปัจจุบันหรือทำซ้ำขั้นตอนหลังจากการอัพเดททุกครั้ง
Jacob Vlijm

1
@JacobVlijm ใช่ว่าจะเป็นเช่นนั้นหากฉันสร้างแพ็คเกจ deb แต่ฉันไม่ได้มันจะถูกติดตั้ง/usr/local/bin/ดังนั้นระบบจะเรียกใช้สำเนาที่แก้ไขแล้วตามที่แสดงไว้ใน$PATH
user.dz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.