Nautilus: सिम्लिंक के माध्यम से निर्देशिका का दौरा किया, अब मैं लक्ष्य निर्देशिका पदानुक्रम में एक स्तर ऊपर नहीं जा सकता


14

मैंने "मेक लिंक" विकल्प के माध्यम से एक शॉर्टकट बनाया। जब मैं इस शॉर्टकट के फ़ोल्डर में प्रवेश करता हूं तो मैं इसके ऊपर कोई भी फ़ोल्डर नहीं देख सकता, इसलिए मैं आसानी से उन पर नेविगेट नहीं कर सकता।

क्या जीयूआई में एक फ़ोल्डर ऊपर जाने का एक तरीका है? शायद एक हॉटकी? ( cd ..इस समय नहीं कर सकते ^ __ ^)।

यहां छवि विवरण दर्ज करें


उदाहरण के लिए विंडोज में मैं वास्तव में मेरे द्वारा बताए गए तरीके से नेविगेट करने में सक्षम हूं, यहां एक Win10 छवि है जो इसे समझाती है:

यहां छवि विवरण दर्ज करें


क्या आपने बैकस्पेस कुंजी की कोशिश की है?
पेंग्विनसीएससी

3.16 से कम के नॉटिलस में, नॉटिलस टूलबार में पैरेंट बटन को जोड़ना आसान होता है, हालांकि स्रोत के माध्यम से किया जाना है> पुनर्निर्माण (14.04 उपलब्ध के लिए पैच या एक ppa बिल्ड) अन्यथा प्रयास करेंAlt+up key
doug

Alt + Up मुझे लिंक के डेस्टिनेशन से डेस्कटॉप पर लाता है ... तो दुख की बात है: \ n अगर यहाँ किसी के पास सही कनेक्शन हैं तो वह सीधे देव टीम को ऑफर कर सकता है? मेरे पास बहुत नया है इसलिए मैं वास्तव में इसे सीधे पेश नहीं कर सकता, बिना डेटा के कई लोगों को गुजरना पड़ता है (मुझे लगता है) ...
जॉनडियो

ओह, अब समझा तुम्हारा क्या मतलब है। शायद याकूब के समाधान की कोशिश करें या खुद लिंक बनाएं। आपके वर्तमान लिंक को एक निर्देशिका के रूप में देखा जाता है, इसलिए यह 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

जहां अनुभाग के बाद ->है असली सिमलिंक अंदर पथ, या, का उपयोग करते हुए python:

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

एक nautilusस्क्रिप्ट में इसका उपयोग करके , हम अप्रत्यक्ष रूप से वर्तमान फ़ाइल या फ़ोल्डर में वास्तविक पथ प्राप्त कर सकते हैं ।

फिर अगर हमारे पास रास्ता है, तो हम कैसे नॉटिलस को एक स्तर ऊपर ले जाते हैं?

फिर, हम इसे हल नहीं कर सकते और अपने हाथ साफ रख सकते हैं। एक स्तर को ऊपर ले जाने के लिए, हम पहले पाए गए पथ को थोड़ा संपादित करते हैं:

/path/to/a/folder

में

/path/to/a

तब, xdotoolअनुकरण करने के लिए Ctrl+ L(GUI शॉर्टकट को एक नॉटिलस विंडो में पथ सम्मिलित करने के लिए, क्योंकि वर्तमान विंडो का उपयोग करके किसी अन्य निर्देशिका में जाने के लिए कोई 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. अब आपको स्क्रिप्ट को दाईं ओर चलाने में सक्षम होना चाहिए- किसी फ़ाइल (किसी भी)> स्क्रिप्ट> स्तर_अप पर क्लिक करें :

    यहां छवि विवरण दर्ज करें


[ EDIT ] मैंने खिड़की पर पथ को पेस्ट करने के लिए ऊपर की स्क्रिप्ट को बदल दिया nautilus, बजाय इसे xdotool टाइप करने के। इसे needs xclipस्थापित किया जाना है, लेकिन यह एक बड़ा सुधार है, खासकर बहुत लंबे रास्तों पर।


2. वैकल्पिक रूप से, बेहतर निर्देशिका में एक नई नॉटिलस विंडो खोलें

माता-पिता की निर्देशिका में स्क्रिप्ट को एक नई नॉटिलस विंडो खोलने से आप उपयोग करने से बच सकते हैं । स्क्रिप्ट तब और भी छोटी होगी:xdotool

#!/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 से उपयोग किया जाता है, तो स्वचालित रूप से .desktopराइट-क्लिक पर निष्पादन योग्य फ़ाइलों को बनाने के लिए एक नॉटिलस स्क्रिप्ट उपयोगी हो सकती है:

शॉर्टकट बनाने के लिए निर्देशिका पर राइट-क्लिक करें (लिंक के रूप में व्यवहार)

यहां छवि विवरण दर्ज करें

सीलिंक के विपरीत, ये लिंक आपको वास्तविक फ़ोल्डर में ले जाएंगे, बिना फ़ोल्डर के ही व्यवहार के बिना:

यहां छवि विवरण दर्ज करें

लिपी

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

नायब शॉर्टकट विकल्प, थोड़ा इस मामले में सीमित कर रहे हैं के बाद से स्क्रिप्ट ही अनुकरण करेगाCtrl+L, औरCtrl+Alt+Lआप ... लॉग आउट कर देगाCtrl+\अपने सिस्टम पर काम ठीक।

व्याख्या

यह स्क्रिप्ट Ctrl+ का अनुकरण भी करती है L, लेकिन नॉटिलस का उपयोग करने के बजाय "NAUTILUS_SCRIPT_CURRENT_URI", यह xclipस्वचालित रूप से चयनित पथ को नॉटिलस विंडो में कॉपी करने के लिए उपयोग करता है। विकल्प 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))" "
"

अंतिम उद्धरण में केवल एक नई पंक्ति या रिटर्न ( 0x0a) होना चाहिए । pwdभीतर से नॉटिलस जब एक पार्टी / टर्मिनल से चलाने से एक अलग परिणाम पैदा करता है - यह वास्तविक पथ, नहीं पथ लिंक का उपयोग कर देता है।


मैं मानता हूं कि इसका कोई मतलब नहीं है, यह अनिर्दिष्ट है, और मैं यह भी पता नहीं लगा सकता कि किस तरह का निष्पादन पर्यावरण कोड चला रहा है (मुझे कोई शेल नहीं मिल सकता है जो उस परिणाम का उत्पादन करता है), लेकिन यह काम करता है। यह एक हैक है, यही वजह है कि मैंने नॉटिलस के संस्करण को शामिल किया। कौन जानता है कि यह कब तक चलेगा? अगले नॉटिलस अपग्रेड (या अज्ञात दुभाषिया) पर टूट सकता है, लेकिन मेरे लिए, यह माउंटेड स्थानों के लिंक, डायरेक्टरी ट्री के स्थानों के लिंक, या डायरेक्टरी ट्री में सिर्फ सादे स्थानों पर काम करता है।


मैं Ubuntu 15.10 का उपयोग करता हूं ... क्या यह एक समान कोड में काम कर सकता है?
जॉनडोए

1
इसका कोई मतलब नहीं है, शेल$(pwd) की कामकाजी निर्देशिका है , नॉटिलस की नहीं । सहायता देखें ।ubuntu.com
जैकब व्लिजम

@बेनोस मैं पुष्टि करता हूं, यह 15.10 में काम करता है
user.dz

@JacobVlijm, यह अच्छी तरह से काम करता है, यह मुझे उचित लगता है, वर्तमान निर्देशिका में नॉटिलस स्क्रिप्ट चलाता है।
user.dz 18-1816

1
इसके अलावा मेरे आश्चर्य को @Setsets, यह काम करता है। आपके पास एक समय समस्या है, जब बहुत लंबे रास्तों पर उपयोग किया जाता है। आपको पथ की लंबाई के आधार पर, तब एक ब्रेक सेट करने की आवश्यकता होगी। टूटे हुए रास्ते दिखाई देते हैं। सबसे पहले, मैंने इसे एक (मनमाना) विराम के साथ तय किया, नवीनतम संस्करण में, मैंने पथ को xclip पेस्ट किया, जो पथ की लंबाई के अधीन नहीं है।
जैकब व्लिजम

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, यह कुछ समय पहले बग के रूप में सूचित किया गया था। अगर आपको लगता है कि यह एक विशेषता है, तो एक अन्य बग रिपोर्ट सबमिट करें, जो स्विच या इसके लिए विशिष्ट शॉर्टकट सेट करने के लिए कहे।

संदर्भ: मैं नॉटिलस को डेरीफेरिंग सिम्लिंक से कैसे रोक सकता हूं? [बन्द है]


एक मुद्दा यह हो सकता है कि आपको या तो नॉटिलस के वर्तमान संस्करण को पिन करने की आवश्यकता है, या हर अपडेट के बाद प्रक्रिया को दोहराएं।
जैकब व्लिजम

1
@JacobVlijm, हां, अगर मैं डिबेट पैकेज का निर्माण करूंगा तो ऐसा होगा। लेकिन मैंने ऐसा नहीं किया, इसे स्थापित किया जाएगा /usr/local/bin/, इसलिए सिस्टम हमेशा संशोधित प्रति को चलाएगा, जैसा कि सूचीबद्ध है$PATH
user.dz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.