यह एक चुनौतीपूर्ण सवाल क्यों है
प्रश्न में कुछ चुनौतियां हैं:
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, हमारे पास एक कार्य समाधान है !
प्रयोग में
हम अपने डेस्कटॉप पर एक लिंक ("लिंक टू टेलीग्राम") से खोले गए हैं। असली फ़ोल्डर मेरी की एक उप फ़ोल्डर है 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
और इसे निष्पादन योग्य बनाएं
- आपको लॉग आउट करके वापस अंदर जाना पड़ सकता है।
अब आपको स्क्रिप्ट को दाईं ओर चलाने में सक्षम होना चाहिए- किसी फ़ाइल (किसी भी)> स्क्रिप्ट> स्तर_अप पर क्लिक करें :
[ 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])
कैसे इस्तेमाल करे
- स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे
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
नायब शॉर्टकट विकल्प, थोड़ा इस मामले में सीमित कर रहे हैं के बाद से स्क्रिप्ट ही अनुकरण करेगाCtrl+L, औरCtrl+Alt+Lआप ... लॉग आउट कर देगाCtrl+\अपने सिस्टम पर काम ठीक।
व्याख्या
यह स्क्रिप्ट Ctrl+ का अनुकरण भी करती है L, लेकिन नॉटिलस का उपयोग करने के बजाय "NAUTILUS_SCRIPT_CURRENT_URI"
, यह xclip
स्वचालित रूप से चयनित पथ को नॉटिलस विंडो में कॉपी करने के लिए उपयोग करता है। विकल्प 1 की तरह, स्क्रिप्ट तब वास्तविक पथ की गणना करती है और बेहतर निर्देशिका प्राप्त करती है।
यह विकल्प उपयोगी हो सकता है यदि आप कीबोर्ड को राइट-क्लिक का उपयोग करना पसंद करते हैं।