सीडी का उपयोग कर कई निर्देशिका स्तर ऊपर जाना है


39

मैं जावा प्रोजेक्ट्स के साथ काम कर रहा हूँ जिसके परिणामस्वरूप अक्सर नेस्टेड फोल्डर (/ path / to / project / com / java / lang / जो भी हो, आदि) और कभी-कभी कूदने में सक्षम होना चाहते हैं, कहते हैं, 4 डायरेक्टरी का स्तर ऊपर की ओर। टंकण cd ../../// .. एक दर्द है, और मैं सहानुभूति नहीं चाहता। क्या सीडी में कुछ ध्वज हैं जो आपको कई निर्देशिका स्तर तक जाने की अनुमति देते हैं (मेरे सिर में, यह सीडी -यू 4 जैसा कुछ होगा)? दुर्भाग्य से, मैं विशेष रूप से सीडी के लिए कोई भी मैन पेज नहीं खोज सकता, इसके बजाय सिर्फ बेकार "बिल्डिंस" पेज प्राप्त कर सकता हूं।


1
व्याख्या करने के लिए बैश को संशोधित करें cd ...जहां 'की संख्या है।' ऊपर जाने के लिए स्तरों की संख्या होगी। क्या यह एक संघर्ष का कारण होगा जिसकी मुझे जानकारी नहीं है?

MacOS के लिए यहां आने वालों के लिए आप इंस्टॉल कर सकते हैं zshऔर Oh My Zshजो एक बेहतर विकल्प है bashऔर फिर आप बस cd ...(कई डॉट्स) कर सकते हैं जैसे कि यह होना चाहिए
डोमिनिक

जवाबों:


29

या ... यह प्रयास करें:

निर्देशिका का उपयोग करके ऊपर नेविगेट करें ..:

नीचे दिए गए उदाहरण में, .. 4 का उपयोग 4 डायरेक्टरी लेवल पर जाने के लिए किया जाता है, ।।

निम्न उपनाम को .bash_profile और पुनः लॉगिन में जोड़ें।

उपनाम .. = "सीडी .."

उपनाम .. २ = "सीडी ../ .."

उर्फ ..3 = "सीडी ../../ .."

(आदि)

हैक # 2 देखें


10
मैं इसके बजाय उपनामों का उपयोग करूंगा .., ...और ....जैसा कि वे टाइप करने के लिए तेज़ हैं, लेकिन उपनामों का सिद्धांत निश्चित रूप से समान है।
बर्नहार्ड

1
@bernhard से अधिक आपका स्वागत है, क्योंकि मुझे विश्वास नहीं है कि यह किसी भी टकराव का कारण होगा। मैंने इसे सिर्फ इसलिए छोड़ दिया क्योंकि मैंने इसे वेबसाइट से उद्धृत किया था।
कटकविज्म

डॉस के लिए 4DOS.EXE शेल ने भी समर्थन किया cd ..., cd ....आदि यह बहुत आसान था।
एलेक्सिस

..... 4 से अधिक तेज़ नहीं है, वास्तव में यह 2 अक्षर धीमा है ..
रयान

29

एक साधारण कार्य, एक उपनाम के साथ भी:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

( ~/.bashrcयदि आप इसे हर उदाहरण में चाहते हैं तो आप इसे परिभाषित कर सकते हैं )।

यह उपयोग करने के लिए सरल है:

$ cd.. 10

अच्छा है! मेरे लिये कार्य करता है! बैश 4.3.11
कार्लोस

2
अच्छा उत्तर; आप का कहना है कि इस समाधान की तुलना में बेहतर है जैसे चाहते हो सकता है eval $(printf "cd ..;%.s" $(seq $1))जो cdक्योंकि, कई बार ~-उर्फ $OLDPWDकिसी मध्यस्थ निर्देशिका के लिए की तुलना में पहले मंगलाचरण से काम कर निर्देशिका के लिए निर्धारित है,। पुनश्च - cd $(printf %.s../ $(seq "$1"))यदि आप चाहते हैं तो यह सरल हो जाता है ।
टॉबी स्पाइट

10

एक सरल, कम-तकनीकी समाधान जिसमें किसी भी सेटअप की आवश्यकता नहीं होती है। केवल bash-स्टाइल कमांड संपादन के साथ गोले में काम करता है , हालांकि।

  • प्रकार cd ..
  • Up-arrow Returnआवश्यकतानुसार कई बार दबाएं । बहुत तेजी से अगर आप दो उंगलियों का उपयोग करते हैं।

2
हाहा, एक बुरा जवाब नहीं मुझे लगता है :)
joshmcode

8

सही उत्तर को 'cd + n' बताता है, जहाँ n वह स्तर है जहाँ आप ऊपर जाना चाहते हैं। बहुत बुरा यह कहीं भी प्रलेखित नहीं है!


17
कम से कम यह बाश में काम नहीं करता है।
होंगझोउ

5
डेबियन के साथ भेज दिया गया है के रूप में 4.2.25 पर काम नहीं करता है। जिज्ञासा से बाहर, क्या * निक्स और / या खोल आप उपयोग कर रहे हैं?
एलेक्सिस जूल

बैश में एक अंतर्निर्मित कहा जाता dirsहै जो तर्क के रूप में [+ n] लेता है, और nth अद्वितीय निर्देशिका को प्रिंट करता है जिसे इसके माध्यम से जोड़ा गया था pushd। यदि आप alias cdकरने के लिए pushdहै, तो आप इस का उपयोग कर सकते हैं। हालांकि, ध्यान दें कि यह तकनीकी रूप से ओपी के सवाल का जवाब नहीं है, क्योंकि इसका अद्वितीय निर्देशिकाओं के साथ करना है , जिसका अर्थ है कि आदेश समय के साथ गड़बड़ हो जाता है, जैसा कि आप उसी निर्देशिका में वापस आते हैं।
ब्रायन पीटरसन

हाँ, pushdऔर popdएक [+ n] विकल्प भी लें, यही कारण है कि काम करने में सक्षम है। हालांकि, यह अपूर्ण और अप्रत्यक्ष है, मुझे लगता है कि इसका उपयोग प्रश्न के उत्तर के रूप में किया जा सकता है। अक्सर आपने हाल ही में आपके ऊपर निर्देशिकाओं का दौरा किया, इसलिए वे निर्देशिका स्टैक द्वारा संग्रहीत अंतिम 10 डायरियों में होंगे।
ब्रायन पीटरसन

मेरे लिए काम नहीं किया ...
Vass

4

आप एक फ़ंक्शन लिख सकते हैं (यह एक फ़ंक्शन होना चाहिए, जैसा कि आप अपने शेल की स्थिति को स्वयं बदलना चाहते हैं, अर्थात् कार्यशील निर्देशिका; एक बाहरी कमांड केवल अपनी प्रक्रिया को प्रभावित करेगी)।

यहाँ एक फ़ंक्शन है जो भौतिक निर्देशिका संरचना में तर्क (डिफ़ॉल्ट 1) के रूप में पारित किए गए कई स्तरों को पूरा करेगा (इसलिए, जैसे cd -P .., n बार):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

इसे इस तरह उपयोग करें:

up 4

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन क्यों और / या इस कोड के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करने से प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
डोनाल्ड डक

1
सहमत, मैंने मदद करने के लिए कुछ टिप्पणियां जोड़ी हैं।
एमजिल्ड

नाइटपिक होने के लिए, क्या up 4वास्तव में cd /some/dir/मानने के बराबर नहीं है $PWD = "/some/dir/that/is/deeply/nested/"?
Snapfractalpop

2

आप के लिए नहीं वास्तव में क्या कह रहे हैं, लेकिन आप इस पर गौर करना चाहिए pushdऔर popd। मैं उन्हें कुछ cd...उपनामों की तुलना में फ़ोल्डर नेविगेशन के लिए बहुत अधिक उपयोगी लगता हूं

यदि आप कुछ निश्चित क्षेत्रों से आगे और पीछे जा रहे हैं, तो सामान्य बात यह है कि उपनाम है।

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

उपनामों का उपयोग करने के बजाय आप निम्नलिखित बैश फ़ंक्शन का उपयोग कर सकते हैं:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(या एक-लाइनर के रूप में function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; }) :

~/.bashrcइसे अपनी फ़ाइल में जोड़ने से यह आपके टर्मिनल में उपलब्ध हो जाएगा और ../../../../../../कॉल करने cdसे पहले स्ट्रिंग का निर्माण भी cd -शुरू निर्देशिका में वापस कूदने के लिए उपयोग करना संभव बना देगा ।

एक अधिक उपयोगी कार्यान्वयन में कुछ उपयोगकर्ता-इनपुट जांच भी शामिल हो सकते हैं:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}

0

क्या आप ऑटोजंप के बारे में जानते हैं ? यह एक तृतीय पक्ष हैक है, लेकिन आपके परिदृश्य में उपयोगी हो सकता है।


0

शायद ही कभी इस्तेमाल किया पर्यावरण पैरामीटर की कोशिश करो CDPATH। फिर आपको स्तर को स्पष्ट रूप से निर्धारित नहीं करना पड़ सकता है।

उदाहरण:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

यदि कई प्रोजेक्ट्स पर काम कर रहे हैं, तो आप CDPATH सेटिंग को प्रोजेक्ट विशिष्ट वातावरण फ़ाइल में बना सकते हैं। और अतिरिक्त स्वचालन के लिए एक शिम के साथ इसे ट्रिगर करें।

मैं पुशड और पोप का काफी इस्तेमाल करता हूं। मैं CDPATH का उपयोग करने के लिए मुझे एक परियोजना में उपखंडों के बजाय परियोजना के पेड़ों के बीच हॉप करने की अनुमति देता हूं - लेकिन इस समय मैं कई बड़ी परियोजनाओं पर काम कर रहा हूं, कुछ बड़ी परियोजनाओं पर नहीं। :)


0

यदि आप पहले लक्ष्य निर्देशिका पर हैं:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

DirB पर एक नज़र डालें । यह एक BASH स्क्रिप्ट है जो आपको निम्नानुसार बुकमार्क बनाने की अनुमति देती है:

संचालन

  • एक निर्देशिका बुकमार्क सहेजें
  • जी एक बुकमार्क या नामित निर्देशिका पर जाएं
  • p धीर स्टैक पर एक बुकमार्क / निर्देशिका धक्का
  • सहेजे गए बुकमार्क को निकालें
  • डी प्रदर्शन बुकमार्क निर्देशिका पथ
  • sl निर्देशिका निर्देशिका की सूची प्रिंट

बहुत सरल, बहुत प्रभावी।


0

@ ग्रिगोरी के उत्तर से आगे कदम:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

अर्थात् :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

इसी सटीक समस्या से बीमार हो गए और परिणामस्वरूप सीडी-प्लस लिखना समाप्त कर दिया । एक एकल फ़ाइल सीएलआई उपयोगिता जो आपको कई निर्देशिकाओं को सीडी करने देती है।

प्रयोग

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/

0

नीचे दिए गए कोड को जोड़कर तीन प्लस डॉट नोटेशन को पूरा करने के लिए पूरा किया .bashrcजाएगाcd

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

एक बार जब यह स्निपेट आपके बैश शेल टाइपिंग में चलाया जाता है cd .../और मारना <TAB>पथ को पूरा कर देगा ../../और सभी निर्देशिकाओं के सापेक्ष पथों को सूचीबद्ध करेगा जो उदाहरण के लिए दो स्तर ऊपर हैं।

अद्यतन : ऊपर दिए गए कोड में संदर्भित विधि bash-completionतक पहुंच के लिए स्थापित किया जाना चाहिए _cd। यह अधिकांश कमांड लाइन पैकेज प्रबंधकों के माध्यम से स्थापित करने योग्य है

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