क्या हमारे पास cd के लिए अधिक इतिहास है?


42

cd -अंतिम विज़िट की गई निर्देशिका में जा सकते हैं। क्या हम पिछले एक के अलावा और भी इतिहास देख सकते हैं?


जवाबों:


31

आप जिस कमांड को देख रहे हैं वह है pushdऔर popd

आप का एक व्यावहारिक काम कर उदाहरण देख सकते हैं pushdऔर popdसे यहाँ

mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4

cd /tmp/dir1
pushd .

cd /tmp/dir2
pushd .

cd /tmp/dir3
pushd .

cd /tmp/dir4
pushd .

dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

1
$OLDPWDयदि आप एक ही कमांड का उपयोग करके दो निर्देशिकाओं के बीच आगे और पीछे फ्लिप करना चाहते हैं, तो भी मैं अनिश्चित हूं कि यह शेल-विशिष्ट और वितरण / कर्नेल-विशिष्ट कैसे है।
मेकलेनक्स

4
@ivy_lynx OLDPWDसभी POSIX गोले में मौजूद है, लेकिन यह इस सवाल के लिए बेकार है जो पूछता है कि इससे आगे कैसे जाया जाए (सवाल में पहले ही उल्लेख cd -किया गया है जो एक शॉर्टकट है cd "$OLDPWD")।
गिल्स एसओ- बुराई को रोकना '

2
वहाँ एक कारण है कि आप का उपयोग है cd /tmp/dir1; pushd . बस के बजाय pushd /tmp/dir1?
जीएनपी

@gnp, कोई विशेष कारण नहीं। यह सिर्फ उस लिंक से लिया गया था जिसका मैंने उत्तर में उल्लेख किया है। pushd /tmp/dir1बस ठीक काम करना चाहिए।
रमेश

1
ठीक है, बस मेरी जिज्ञासा को उठाया। मैं आपको एक वास्तविक उदाहरण का उपयोग करके pushdऔर popdएक डायरेक्टरी ट्री को आगे-पीछे करने के साथ अपने उत्तर को बेहतर बनाने का सुझाव देना चाहता हूं । आपका उत्तर पहले से ही सही है।
जीएनपी

53

आपने निर्दिष्ट नहीं किया कि आप किस शेल का उपयोग कर रहे हैं, इसलिए इसे zsh का विज्ञापन करने का बहाना दें।

हाँ, हम के लिए और अधिक इतिहास की क्या ज़रूरत है cd, अर्थात् cd -2, cd -4आदि बहुत सुविधाजनक है cd -TAB, विशेष रूप से पूरा होने प्रणाली के साथ और रंग सक्षम:

यह मेरे पास है .zshrc:

setopt AUTO_PUSHD                  # pushes the old directory onto the stack
setopt PUSHD_MINUS                 # exchange the meanings of '+' and '-'
setopt CDABLE_VARS                 # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit   # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'

और परिणाम:

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


4
bash bash bash bash
टिम

7
ठीक है, मैं इस उत्तर को नहीं हटाऊंगा, शायद दूसरों के लिए उपयोगी होगा।
जिम्मीज

23
जब तक प्रश्न विशेष रूप से इसके बारे में नहीं पूछता है bash, यह एक वैध उत्तर है। इसे हटाओ मत।
लियोरी

क्या होगा यदि ओपी केवल बैश को शामिल करने के लिए अपने प्रश्न को संपादित करता है, तो क्या यह जवाब अभी भी मान्य होगा?
ओकर

3
यह उल्लेख हो सकता है कि इसके अलावा setopt AUTO_PUSHD, उपरोक्त सेटअप में से किसी को भी स्टॉक zsh में पूरा होने के साथ एक सर्वव्यापी निर्देशिका स्टैक प्राप्त करने की आवश्यकता नहीं है। ( और स्वाद का एक मामला) PUSHD_MINUSकी भावना को उलट देता है , निर्देशिका स्टैक के लिए अप्रासंगिक है, और यहां दिए गए आह्वान बस एक निर्देशिका स्टैक पूरा होने के उत्पादन में रंग जोड़ता है। हालाँकि, को पूर्ण उप-प्रणाली के साथ आरंभ करना चाहिए । cd +cd -CDABLE_VARSzstyleautoload -U compinit && compinit
wjv

13

"अधिक इतिहास" के संबंध में आपके प्रश्न का उत्तर देने के लिए। cd -बैश में कोई भी सुविधा केवल एक ही निर्देशिका का समर्थन नहीं करती है जिसे आप वापस "फ्लिप" कर सकते हैं। जैसा कि @ रमेश ने अपने उत्तर में कहा है। आप निर्देशिका की एक लंबी इतिहास चाहते हैं तो आप उपयोग कर सकते हैं pushdऔर popdएक निर्देशिका बचाने या पिछले एक पर लौटने के लिए।

आप dirsकमांड के साथ स्टैक में वर्तमान में क्या है की सूची भी देख सकते हैं ।

इस जवाब से एक विस्तृत विवरण पाया जा सकता है: मैं पुशड और पॉपड कमांड का उपयोग कैसे करूं?


मैंने आपके उत्तर से एक संदर्भ शामिल किया है। आशा है कि आप बुरा नहीं मानेंगे :)
रमेश

@ रमेश - नहीं आगे बढ़ो।
स्लम

8

आप बैश के लिए मेरी डीहिरस्टोन उपयोगिता स्थापित और उपयोग कर सकते हैं ।

मूल रूप से, यह एक डेमन है जो आपके सभी गोले से निर्देशिका परिवर्तन एकत्र करता है, और एक सीडीडी प्रोग्राम जो इतिहास को प्रदर्शित करता है और आपको स्विच करने के लिए किसी भी निर्देशिका को चुनने देता है (इसलिए आप स्टैक तक सीमित नहीं हैं)।


7

आपके पास उतना ही इतिहास है जितना आप चाहते हैं:

cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
        set -- "$@" "$DIRSTACK"               &&
        DIRSTACK='pwd -P >&3; command cd'     ||
        { command cd "$@"; return; }
_q()    while   case "$1" in (*\'*) :   ;;      (*)
                ! DIRSTACK="$DIRSTACK '$2$1'"   ;;esac
        do      set -- "${1#*\'}" "$2${1%%\'*}'\''"
        done
while   [ "$#" -gt 1 ]
do      case    ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
        (*)     eval "  set $((${1#-}+1))"' "${'"$#}\""
                eval '  set -- "$2"'" $2"'
                        set -- "${'"$1"'}" "$1"'
        ;;esac; _q "$1"; shift
done
eval "  DIRSTACK=; $DIRSTACK    &&"'
        _q "$OLDPWD"            &&
        DIRSTACK=$DIRSTACK\ $1
        set "$?" "${DIRSTACK:=$1}"'" $1
"       3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
        DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}

यह एक शेल फंक्शन है जो किसी भी पोसिक्स संगत शेल को zsh-स्टाइल cdइतिहास में सक्षम बनाता है । यह एक भी सब-इंक्वायरी किए बिना अपने सभी काम करता है, और मेरा मानना ​​है कि इसका प्रवाह बहुत अच्छा है - यह सभी मामलों को मध्यम परीक्षण के साथ सही ढंग से संभालने के लिए लगता है।

यह फ़ंक्शन पूरी तरह से पोर्टेबल सिंटैक्स पर भरोसा करते हुए अपने वातावरण के साथ उतनी ही अच्छी तरह से खेलने का प्रयास करता है - यह केवल एक धारणा बनाता है और वह यह है कि $DIRSTACKपर्यावरण चर अपनी संपत्ति के साथ जैसा करेगा वैसा ही होगा।

यह उन सभी रास्तों को निर्धारित करता है जो इसे स्टोर करते हैं $DIRSTACKऔर उन सभी को सिंगल-कोट्स पर क्रमबद्ध करते हैं - हालांकि यह सुनिश्चित करता है कि प्रत्येक को सुरक्षित रूप से उद्धृत किया जाए और इसे वैरिएबल के मूल्य में जोड़ने से पहले क्रमबद्ध किया जाए और किसी भी प्रकार के किसी भी विशेष वर्ण के साथ कोई समस्या नहीं होनी चाहिए। । यदि $DIRSTACKMAXपर्यावरण चर सेट किया जाता है तो यह इतिहास में इसे बनाए रखने वाले पथों की संख्या के लिए ऊपरी सीमा के रूप में उपयोग करेगा, अन्यथा सीमा एक है।

यदि आप फ़ंक्शन cdको सामान्य रूप से लोड करते हैं, लेकिन cd -[num]अपने परिवर्तन निर्देशिका इतिहास के माध्यम से वापस वापस करने के लिए भी कर पाएंगे ।

फ़ंक्शन का प्राथमिक तंत्र cdस्वयं है - और ${OLD,}PWDपर्यावरण चर। POSIX निर्दिष्ट करता है कि cdये हर पथ चाल के लिए बदलते हैं - और इसलिए यह केवल शेल के बिल्ट चर का उपयोग करता है और जब तक आप चाहें तब तक मानों को बचाता है।


@datUser - मुझे पता था कि किसी के पास एक डाट था। आप काफी स्वागत करते हैं
mikeserv

4

Acd_func.sh स्क्रिप्ट में केवल करता है कि तुम क्या वर्णन। अनिवार्य रूप से यह cdफ़ंक्शन को ओवरलोड करता है और आपको cd --पहले से देखी गई निर्देशिकाओं की एक सूची प्राप्त करने के लिए टाइप करने में सक्षम करता है , जिसमें से आप संख्या द्वारा चयन कर सकते हैं। मुझे अब इसके बिना बैश का उपयोग करना बहुत मुश्किल है, और इसकी पहली चीज जो मैं एक नई प्रणाली पर स्थापित करता हूं।



3

दूसरों ने पहले से ही कुछ दिलचस्प समाधानों को कवर किया। कुछ समय पहले मैंने एक संबंधित समस्या के लिए अपना समाधान बनाया था जिसे "सीधे इतिहास" करने के लिए जल्दी से संशोधित किया जा सकता था। मैं मूल रूप से कुछ प्रयुक्त निर्देशिकाओं को "लेबल" करना चाहता था, और चाहता था कि सभी खुले गोले उन्हें देखें, और उनके लिए विद्रोहियों के बीच बने रहें।

#dir_labels
#functions to load and retrieve list of dir aliases

function goto_complete {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    local cur possib
    cur="${COMP_WORDS[COMP_CWORD]}"
    possib="${!dir_labels[@]}"
    COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) )
}

complete -F goto_complete goto

function goto {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    key="$1"
    else
    key=default
    fi
    target="${dir_labels[$key]}"
    if [ -d "$target" ]; then
    cd "$target"
    echo "goto $key: '$target'"
    else
    echo "directory '$target' does not exist"
    fi
}

function label {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    target="$1"
    else
    target="default"
    fi
    dir_labels["$target"]=$PWD
    for i in "${!dir_labels[@]}"; do
    echo "$i ${dir_labels[$i]}"
    done > ~/.dir_labels
}

मूल रूप से मैं बस करना चाहते हैं label fooवर्तमान निर्देशिका कॉल करने के लिए fooतो जो कुछ भी शैल से, और goto foowhould cdसीधे वहाँ। खाली तर्क: के labelलिए एक डिफ़ॉल्ट लक्ष्य बनाएगा goto

मैं उपनामों को स्वचालित रूप से हटाने को लागू करने से परेशान नहीं था, लेकिन अन्यथा, मैं अभी भी इसे थोड़ा संशोधित रूप में उपयोग कर रहा हूं।


2

आप http://fex.belwue.de/fstools/bash.html से मेरे "सीडी इतिहास" फ़ंक्शन का उपयोग कर सकते हैं

यह हर उस निर्देशिका को याद करता है जहाँ आप रहे हैं और "cdh" के साथ आपको अंतिम 9 निर्देशिकाओं की एक सूची दिखाई देगी। बस संख्या दर्ज करें और आप इस निर्देशिका में वापस आ गए हैं।

उदाहरण:

framstag @ wupp: /: CDH
1: / usr / स्थानीय / बिन
2: / var
3: /
4: / tmp / 135_pana / 1280
5: / tmp / 135_pana
6: / tmp / weihnachtsfeier
7: / tmp
8: / स्थानीय / घर / फ्रैमस्टाग
चयन करें: 
framstag @ wupp: / tmp / 135_pana / 1280:

सीडीएच ऑटोकैड उर्फ ​​"सीडी के बिना सीडी" के साथ काम करता है: आपको सीडी या पुशड टाइप करने की आवश्यकता नहीं है।


2

मैं आपको अपनी विस्तारित 'सीडी' फ़ंक्शन की सिफारिश करना चाहता हूं:

https://github.com/dczhu/ltcd

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

यह जीवन को आसान बनाने के लिए निम्नलिखित सुविधाएँ प्रदान करता है:

  • वैश्विक dir लिस्टिंग, जो हाल ही में सभी टर्मिनल टैब / विंडो से dirs को दर्शाती है।
  • स्थानीय dir लिस्टिंग, जो वर्तमान शेल सत्र के लिए स्थानीय है।
  • दोनों लिस्टिंग j / k (नीचे जाएं / ऊपर), संख्याओं और शब्द खोज का उपयोग करके त्वरित नेविगेशन का समर्थन करती हैं।
  • ग्लोबल फ्री जंपिंग (उदाहरण के लिए "cd dir" या "cd ar" / to / path / to / foo / bar / directory / a)।

हम्म, होनहार लग रहा है। मैं इसे देख लूँगा।
ddnomad

1

के लिए पार्टी , मूल रूप से: बजाय सीडी उपयोग का उपयोग करने के pushdलिए, परिवर्तन directorys ताकि वे सहेजे जाते हैं (खड़ी अर्थ)

pushd /home; pushd /var; pushd log

स्टैक का उपयोग dirsऔर आसान नेविगेशन देखने के लिए ("स्टैक-एंट्रीज़" की संख्या का उपयोग करने के लिए:

dirs -v

आउटपुट:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

अब इन नंबरों का उपयोग करें cdऔर ~जैसे:

cd ~1

लेकिन अब इन नंबरों को फिर से जोड़ दिया गया है और स्थिति "0" बदल जाएगी, इसलिए बस pushdशीर्ष स्थिति में निर्देशिका को दो बार (या स्थिति 0 पर एक डमी का उपयोग करें) जैसे:

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

अब 1..3 वहां स्थिति रखेगा कि मैंने इसे कहीं पढ़ा, लेकिन अब और नहीं जानता, इसलिए श्रेय नहीं देने के लिए खेद है

(वर्तमान निर्देशिका को स्टैक से जारी करने के लिए / इतिहास के उपयोग से हटाने के लिए popd)


1

पृष्ठ 312 पर "शेल प्रोग्रामिंग, 4e" में सीडीएच फ़ंक्शन देखें। यह इतिहास को एक सरणी में रखता है।

यहाँ एक और अधिक उन्नत संस्करण है: https://drive.google.com/open?id=0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M

यह फ़ाइल CDHISTFILE में इतिहास संग्रहीत करता है और सबसे हाल की निर्देशिका में बदलने की अनुमति देता है जिसमें एक स्ट्रिंग, जैसे,

cd -src

यह खुद को मौजूदा सीडी कमांड पर स्थापित करता है a alias cd=_cd


1

बस संभव समाधान के रूप में fzf- निशान जोड़ना चाहते थे ।

एक बार स्थापित होने के बाद यह आपको कमांड मार्क करता है और बुकमार्क की गई निर्देशिकाओं को जोड़ने और खोजने के लिए कूदता है (हां, यह पूरी तरह से पूरा इतिहास नहीं है, केवल वही हैं जो आपने खुद को बुकमार्क किया था)।

समस्या मुझे पुशड / पॉपड के साथ है यह विशिष्ट व्यवहार सत्र है, यानी मैं अलग-अलग बैश सत्र पर एक ही स्टैक करना चाहूंगा या जो fzf- निशान के लिए संभव है।


0

मैंने जवाब दिया @mikeserv ने कोशिश की, लेकिन यह मेरे लिए बहुत काम नहीं आया। मैं यह पता नहीं लगा सका कि इसे कैसे ठीक किया जाए, इसलिए मैंने सिर्फ अपना लिखा:

cd() {
    # Set the current directory to the 0th history item
    cd_history[0]=$PWD
    if [[ $1 == -h ]]; then
        for i in ${!cd_history[@]}; do
            echo $i: "${cd_history[$i]}"
        done
        return
    elif [[ $1 =~ ^-[0-9]+ ]]; then
        builtin cd "${cd_history[${1//-}]}" || # Remove the argument's dash
        return 
    else
        builtin cd "$@" || return # Bail if cd fails
    fi
    # cd_history = ["", $OLDPWD, cd_history[1:]]
    cd_history=("" "$OLDPWD" "${cd_history[@]:1:${#cd_history[@]}}")
}

यह GitHub Gist के रूप में भी उपलब्ध है । इसका उपयोग करने के लिए, फ़ंक्शन को अपने .bashrcया समान में पेस्ट करें , और आप उन चीजों को करने में सक्षम होंगे जो आपके द्वारा किए गए cd -55 वें अंतिम निर्देशिका में वापस cd -hजाएंगे, आपको अपने इतिहास का अवलोकन देंगे।

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