कुछ फ़ोल्डर में सीडी तक बैश


16

मैं Magento में बहुत काम करता हूं, और इसलिए मैं जिन लोगों के साथ काम करता हूं, उनमें से बहुत सारे काम करते हैं, और उन्हें टाइप करने के लिए परेशान होना पड़ता है:

cd ../../../../../../

केवल यह जानने के लिए कि आप अभी भी अपने रूट 'httpdocs' फ़ोल्डर से कुछ निर्देशिकाएँ हैं, इसलिए मैं एक स्क्रिप्ट बनाने की कोशिश कर रहा हूँ जो इस छद्म कोड का अनुसरण करती है:

while lowest level directory != httpdocs
    cd ../
end while;

बहुत आसान लगता है, मुझे लगता है कि मुझे जाँच पर कुछ प्रकार का करना होगा अगर वर्तमान कार्यशील निर्देशिका का आखिरी हिस्सा httpdocs है, अगर यह सच होने तक सिर्फ एक स्तर तक नहीं रहता है।

मैं इसके लिए बैश सीखने को देख रहा हूं, हालांकि ऐसा लगता है कि वहां पहले से ही ऐसा ही कुछ है, और सिंटैक्स पहेली मुझे कोई अंत नहीं है।

जवाबों:


8

यह एक शेल फ़ंक्शन होना चाहिए , स्क्रिप्ट नहीं, क्योंकि एक स्क्रिप्ट एक नए शेल में निष्पादित होती है (और इस तरह मूल शेल की निर्देशिका को बदल नहीं सकती है)।

function cdroot()
{
  while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}

आप निश्चित रूप से फ़ंक्शन को नाम दे सकते हैं जो आपको पसंद है।

कुछ स्पष्टीकरण: जब आप httpdocs फ़ोल्डर के अंदर नहीं होते हैं, $PWD != '/'तो पहला परीक्षण ( ) cdrootएक विफल होता है। जब आप रूट पर पहुंच जाएंगे तो यह बंद हो जाएगा।

दूसरा परीक्षण ( ${PWD##*/} != 'httpdocs') थोड़ा अधिक जटिल है। $PWDएक चर है जो वर्तमान निर्देशिका का पथ है। ${PWD##*/}अंतिम स्लेश तक और सब कुछ ट्रिम करता है।


इस पुनरावृत्ति के लिए नकारात्मक पक्ष यह है कि आप अपनी क्षमता खो देते हैं कि आप cd -बाद में जहाँ आप थे वहाँ वापस जाएँ।
एज़ेक्विअल मुन्स

27

मेरे पास uptoमेरे .bashrc में एक फ़ंक्शन है जो आपको वर्तमान पथ पर किसी भी निर्देशिका में नाम से जाने की अनुमति देता है:

upto ()
{
    if [ -z "$1" ]; then
        return
    fi
    local upto=$1
    cd "${PWD/\/$upto\/*//$upto}"
}

मेरे पास इस फ़ंक्शन के लिए भी पूरा है, ताकि यह मुझे वैध निर्देशिका नाम दे और जब मैं टैब हिट करूं:

_upto()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local d=${PWD//\//\ }
    COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto

इसके अलावा, मेरे पास एक और फ़ंक्शन है jdजो मुझे वर्तमान एक से नीचे किसी भी निर्देशिका में कूदने की अनुमति देता है:

jd(){
    if [ -z "$1" ]; then
        echo "Usage: jd [directory]";
        return 1
    else
        cd **"/$1"
    fi
}

उदाहरण:

[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat       hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ 

आप इसके लिए एक उपनाम भी जोड़ सकते हैं upto httpdocs
cjm

@ ड्रोगबैन: jdहर मामले में काम नहीं करता है, क्या आप बताएंगे कि यह कैसे काम करता है?
सीजर

@ सीजर इसमें ग्लोबस्टार ( **) का उपयोग किया गया है । इस सुविधा को अपने बैश शेल उपयोग में सक्षम करने के लिए shopt -s globstar
डोगबेन

2
यह बहुत शानदार ढंग से किया गया है, काश मैं दो बार उत्थान कर पाता।
18

1
मैंने jdफ़ंक्शन में एक गतिशील शोपिंग डिटेक्शन और सक्रियण शामिल किया है , देखें gist.github.com/Rob--W/5888648 । मैंने इसे केवल बैश 4.2.45 के साथ परीक्षण किया है, इसलिए YMMV।
रॉब डब्ल्यू

5

सबसे सरल बैश फ़ंक्शन जिसे आप अपने अंदर डाल सकते हैं .bashrcजो मैं सोच सकता हूं (सरल है क्योंकि यह लूप या बाहरी प्रक्रियाओं का उपयोग नहीं करता है):

cdup() {
    cd "${PWD/\/httpdocs\/*//httpdocs}"
}

इस का उपयोग करता है पैटर्न प्रतिस्थापन के बाद सब कुछ को बदलने के लिए पैरामीटर विस्तार /httpdocs/में $PWDसाथ `/ httpdocs '। यह बहुत गन्दा लगता है क्योंकि हमें बैश सिंटैक्स में आगे की स्लैश से अलग करने के लिए पथ में आगे की स्लैश से बचना पड़ता है। प्लस प्रतिस्थापन स्ट्रिंग में आगे की स्लैश से बचना नहीं है, इसलिए यह असंगत भी दिखता है।

यदि /httpdocs/वर्तमान पथ में नहीं है, तो कोई प्रतिस्थापन नहीं किया जाएगा और यह केवल वर्तमान निर्देशिका में बदल जाएगा।

उदाहरण के लिए, प्रतिस्थापन उस निर्देशिका के /a/b/c/httpdocs/e/f/gसाथ /a/b/c/httpdocsऔर बदल जाएगा cd

फ़ंक्शन को आपके वर्तमान शेल वातावरण में होना चाहिए (या तो फ़ंक्शन या उपनाम के रूप में) क्योंकि एक बच्चा प्रक्रिया अपने माता-पिता की वर्तमान निर्देशिका को बदल नहीं सकती है। यही कारण है कि मैं इसे आपकी .bashrcस्क्रिप्ट में डालने के लिए कहता हूं और शेल स्क्रिप्ट में नहीं।


संयोग से, यह ध्यान देने योग्य है कि यह आपको पदानुक्रम में जितना संभव हो उतना ऊपर ले जाएगा (जो शायद वैसे भी सबसे उपयोगी उपयोग मामला है)।
इब्राहिम

3

आप अपनी प्रोफ़ाइल में ऐसा कुछ भी डाल सकते हैं:

alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'

बस टाइपिंग cdhआपको httpdocsअपने वर्तमान पथ में सबसे ऊपरी निर्देशिका में ले जाएगी।


2

यह आपकी समस्या को पूरी तरह से संबोधित नहीं करता है, लेकिन यह cd ../../../../../../थोड़ा सा करने पर बचाएगा । मैंने उपयोगकर्ता के अज्ञात पद से यह उधार लिया है


अप एन

छलांग एन निर्देशिका निर्देशिका पेड़ में ऊपर

टाइप करने के बजाय

cd ../../../..

आप बस टाइप करें

up 4

और एक

cd -    

आपको वापस लाएगा

फ़ंक्शन का उपयोग करने के लिए अपने .bashrc में रखें।

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.