एक प्रतीकात्मक लिंक के लिए उपनाम के बराबर?


18

मैं खुद को अपने घर के फ़ोल्डर में कुछ निर्देशिकाओं के आसपास कूदने की जरूरत महसूस करता हूं और उन्हें लिखने में थक जाता हूं। मैं एक त्वरित दृष्टिकोण चाहता हूं, जो पारंपरिक रूप से एक प्रतीकात्मक लिंक होगा।

हालाँकि, मैं दर्जनों प्रतीकात्मक लिंक के साथ अपने घर निर्देशिका को अव्यवस्थित नहीं करना चाहता। मैं कुछ ~/links/निर्देशिका बना सकता था और प्रतीकात्मक लिंक के साथ इसे अव्यवस्थित कर सकता था , लेकिन यह अभी भी बदसूरत है। इसके अलावा, मैं प्रतीकात्मक संबंध बनाना चाहूंगा जो वर्तमान दिन निर्देशिका में कूदने के लिए प्रत्येक दिन (.bashrc में परिभाषित) बदल जाए।

क्या एक प्रभावी रूप से एक प्रतीकात्मक लिंक को उर्फ ​​करने का एक तरीका है, कुछ ऐसा बनाना जो त्वरित नेविगेशन के लिए एक लिंक के रूप में पहचाना जाएगा, लेकिन वास्तव में तब प्रकट नहीं होगा जब मैं lsअपने होम डायरेक्टरी का एक काम करता हूं, और वर्तमान सत्र से आगे नहीं बढ़ेगा?


4
आप पुशड और पोप में देखना चाहते हैं
रुई एफ रिबेरो

: मैं अनुकूलनीय और इस सटीक की जरूरत के लिए कम लागत वाली होने के लिए लगता है जेरोन जानसेन के दृष्टिकोण jeroenjanssens.com/2013/08/16/...
ठेओफ्रस्तुस

2
आप किस खोल का उपयोग कर रहे हैं?
गिल्स एसओ- बुराई को रोकना '

@ थियोफ्रेस्टस हेह - यह मूल रूप से वही है जिसे मैंने अपने जवाब में नहीं बल्कि पूरे दिल से स्वीकार किया था।
Mattdm

3
ठीक वही नहीं जो आप ढूंढ रहे हैं, लेकिन फिर भी तब काम आ सकता है जब दो डायरेक्टोरियों के बीच आगे-पीछे कूदना cd -हो : cdपिछली डायरेक्टरी में होगा । इसलिए, यदि आप इसे दो बार करते हैं तो आप वापस उसी स्थान पर चले जाएंगे जहां से आपने शुरू किया था ... स्थिति के लिए बहुत अच्छा है "ओह मैं पिछले स्थान पर someFile.txt को संपादित करना भूल गया" => बस:, कुछ cd -को संपादित करें। Txtcd -
dingalapadum

जवाबों:


12

आप टैब पूर्णता का उपयोग कर सकते हैं। कई लिनक्स वितरण पर डिफ़ॉल्ट रूप से, बैश सेट किया जाता है ताकि जब आप [TAB] कुंजी को हिट करें, तो आपको संभावित मैचों की एक सूची दी जाए, या यदि सिर्फ एक मैच हो, तो यह सब भर जाता है। सीडी के लिए, यह आम तौर पर वर्तमान कार्यशील निर्देशिका की उपनिर्देशिकाओं की एक सूची है। आप इसे अधिलेखित कर सकते हैं, लेकिन मैं इसके बजाय एक उपनाम बनाने का सुझाव देता हूं, जैसे jd"जंप डाइरेक्टरी":

alias jd=cd

और फिर, "बुकमार्क" को परिभाषित करते हुए आप jd के लिए पूर्णता चाहते हैं। बहुत अधिक विकल्पों के लिए बैश मैन पेज देखें (आदेश या फ़ंक्शन से मक्खी पर परिणाम उत्पन्न करने सहित), लेकिन सबसे आसान तरीका सिर्फ शब्दों की एक सूची है -W:

पूरा -W "/ srv / www ~ / tmp ~ / work" jd

अब, टाइप करें jdऔर हिट करें [TAB], और आप अपने "बुकमार्क" देखेंगे। किसी भी अस्पष्ट भाग को टाइप करें, और फिर [TAB] को पूरा करने के लिए हिट करें। (उपरोक्त में, ~मेरे होम डाइरेक्टरी में विस्तार होता है, इसलिए पहले [TAB] मुझे एक देता है /, और अगर मैं हिट करता हूं wऔर [TAB] फिर /srv/wwwसे भर जाता हूं, तो )

~/.bash_profileइसे स्थिर रखने के लिए इसे जरूर लगाएं।

या, हम इसे अगले स्तर तक ले जा सकते हैं। एक निर्देशिका बनाएं ~/.shortcuts- एक डॉट के साथ शुरू, यह छिपा हुआ होगा और आपके अच्छे साफ घर निर्देशिका को मूस नहीं करेगा - और इसे अपने वांछित निर्देशिकाओं के लिए सहानुभूति के साथ भरें। फिर, डाल इस में अपने ~ / .bash_profile:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

यह _list_shortcutsनामों की सूची बनाने के लिए फ़िक्शन में थोड़ा अधिक जटिल पूर्णता को परिभाषित करता है , और jdएक साधारण उपनाम के बजाय एक फ़ंक्शन बनाता है, क्योंकि हम चाहते हैं कि यह केवल अलग से कार्य करे cd-Pकरने के लिए ध्वज cdबनाता है यह सिमलिंक हल, तो सब कुछ पारदर्शी जादू हो जाता है। आपके शॉर्टकट नामों को भी लक्ष्य से मेल नहीं खाना है।

इसलिए:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

और, फैंसी की एक अतिरिक्त खुराक के लिए, jdबिना किसी पैरामीटर के निष्पादित किए जाने पर अपने सभी शॉर्टकटों की सूची बनाएं :

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

नोट: मैं compgen -W $( cmd )इसके बजाय उपयोग करता हूं compgen -C 'cmd'क्योंकि उत्तरार्द्ध मेरे लिए कभी काम नहीं करता है और मुझे समझ नहीं आता कि क्यों। यह मेरा खुद का एक नया सवाल हो सकता है। :)


बहुत ही रोचक। हालांकि एक कैच, इसके लिए अभी भी पूर्ण लिंक टाइप करने की आवश्यकता है, या कम से कम पर्याप्त लिंक गैर-अस्पष्ट बनने के लिए, इससे पहले कि मैं jd के साथ पूरा कर सकूं। एलडीएस को जेड कमांड में जोड़ने का कोई तरीका उन्हें छोटा करने के लिए है? या उन्हें एक निर्देशिका के सापेक्ष बनाते हैं जहां मैं प्रतीकात्मक लिंक संग्रहीत कर सकता हूं जो मुझे लगता है।
dsollen

@dsollen अपडेट देखें :)
mattdm

यह पूरी तरह से काम किया। सभी ईमानदारी में मुझे इस प्रश्न के अच्छे उत्तर की उम्मीद नहीं थी, लेकिन यह वही है जो मैं चाहता था। मैं इसके उपयोग के बारे में बहुत अधिक अनुमान लगाता हूं और जब भी मैं नया वीएम प्राप्त करता हूं, तो मैं उन चीजों की सूची में शामिल होने के लिए पर्याप्त स्वच्छ महसूस करता हूं, जो मेरे मानक पर्यावरणीय परिवर्तनों को क्लोन करने के लिए एक स्वचालित तरीका है। बहुत बहुत धन्यवाद। किसी बिंदु पर जब मेरे पास अधिक खाली समय होगा, तो मैं यह पता लगाऊंगा कि कॉम्पलेक्स के लिए वाक्य रचना कैसे काम करती है?)
dsollen

18

शेल अलायस की विशेषता है कि आप उन पर (कुछ) नाम-पूर्ति (आमतौर पर बाध्य tab) कर सकते हैं। वैकल्पिक रूप से, आप CDPATHसुविधा का उपयोग कर सकते हैं , जो "हाल ही में" (पिछले 5-6 वर्षों के भीतर) नाम-पूर्णता का समर्थन करने के लिए सुधार किया गया है। यदि वह आपके लिए काम करता है, तो इसका यह फायदा है कि आप जो टाइप करते हैं, वह उसके लिए एक महामारी के बजाय निर्देशिका का वास्तविक नाम है।

बैश मैनुअल के अनुसार

CDPATH
cdबिलिन कमांड के लिए खोज पथ के रूप में उपयोग की जाने वाली निर्देशिकाओं की एक बृहदान्त्र-पृथक सूची ।

आगे की पढाई:


CDPATHपर्यावरण चर के बारे में नहीं जानता था , धन्यवाद। मैं git_reposउस चर में अपनी निर्देशिका जोड़ सकता हूं ....
वाइल्डकार्ड

16

उन निर्देशिकाओं के लिए जिन्हें आप अक्सर अक्सर करते हैं, लेकिन दैनिक रूप से नहीं बदलते हैं, एक अन्य विकल्प बस aliasआपकी .bashrcफ़ाइल में कई कमांड रखना है :

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

एक मित्र के पास लगभग 50 लोग हैं; मेरे पास एक मुट्ठी है; जल्द और आसान। केवल

cdo

निर्देशिका को / u01 / app / oracle में बदलने के लिए


वास्तव में। मैंने 1990 के दशक की शुरुआत से इस तंत्र का उपयोग किया है।
wallyk

7

मेरा सुझाव है pushdऔर popd

मैं व्यक्तिगत रूप से उन्हें विकास कार्य / स्रोत कोड पढ़ने, जब कई निर्देशिकाएं शामिल करता हूं, तो उन्हें ढूंढता हूं।

वे एक स्टैक संरचना / LIFO को प्रभावी ढंग से लागू करते हैं, जहां आप एक निर्देशिका ( pushd), और अगले POP निर्देशिका कमांड ( popd) को पुनः प्राप्त करते हैं।

तो, जब एक डायर के अंदर, आप करेंगे:

pushd .

और जब आपको इसे पुनः प्राप्त करने की आवश्यकता होती है, तो आप करते हैं

popd

आप कई pushd(ओं) का प्रदर्शन कर सकते हैं , और popdबाद में निर्देशिकाओं पर लौटने के लिए इसी (ओं) को कर सकते हैं।

मैं यहां एक लिंक छोड़ दूंगा।

http://www.eriwen.com/bash/pushd-and-popd/


1
यह वह समाधान है जिसका मैं भी उपयोग करता हूं, इस अपवाद के साथ कि मैं popdज्यादा उपयोग नहीं करता हूं । मैं अपनी dirsसूची (जो कि pushdआदेशों से आबाद है ) भरता हूं, उन सभी निर्देशिकाओं के साथ, जो मैं उस समय के लिए काम करना चाहता / चाहती हूं, फिर मैं चला जाता हूं pushd +1। फिर, मैं एक सरल के साथ निर्देशिकाओं के माध्यम से साइकिल चला सकता हूं !puजो बहुत तेज है। (ध्यान दें कि उबंटू और सेंटोस दोनों पर, केवल एक क्लीन इंस्टाल पर उपलब्ध कमांड pushdहै , जो शुरू होता है ।)pu
वाइल्डकार्ड

3

आप उन्हें केवल अपने में चर के रूप में रख सकते हैं ~/.bashrc, और फिर वे केवल एक $दूर हैं।

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

स्पष्ट उत्तर चर है , शेल में वे प्रतीकात्मक चीजें जो अन्य चीजों के लिए खड़ी होती हैं, इसी तरह फाइलसिस्टम में प्रतीकात्मक लिंक के लिए।

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

किसी भी सभ्य शेल में, आप Tabचर नामों पर पूर्ण होते हैं जो आगे मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.