सीडी सिर्फ निर्देशिका के नाम टाइप करके?


58

मैं या तो 20 साल पहले कहीं था या मैंने इसके बारे में सपना देखा था।

मूल रूप से:

अगर टाइप blobblobमुझे मिलता है
blobblob: command not found

काफी उचित।

मैं इसे पसंद करूंगा ताकि जब मेरे शेल में वे त्रुटियां हो जाएं - कमांड नहीं मिली - यह देखने के लिए कि क्या कोई निर्देशिका उस नाम ('ब्लॉब्ब्लो') के साथ मौजूद है और यदि यह cdउस निर्देशिका के लिए है।

मुझे यकीन है कि ऐसा नहीं करने या इसे सावधानी से करने के कुछ कारण हैं।
मुझे लगता है कि हालांकि यह काफी साफ-सुथरा होगा और मैं इसे कहीं और (जैसे यहां!) खोजकर आजमाना चाहूंगा।

मुझे पता नहीं है कि थोड़े शेल प्रोग्रामिंग कैसे करें यह असंभव है।

जवाबों:


76
  • दे घुमा के: shopt -s autocd
  • Zsh: setopt autocd
  • tcsh: set implicitcd

साथ ही, 'ऑटोजंप' एक उपयोगी उपकरण है। एक बार स्थापित होने के बाद यह निर्देशिकाओं को याद रखता है ताकि आप j abc टाइप कर सकें और यदि आपने पहले abc पर विजिट किया है, तो x / d / f / g / t / abc कहें, तो यह वहाँ पर cd होगा!
https://github.com/joelthelion/autojump


1
Yup I shopt -s autocdने कमांड लाइन पर काम किया। अब मैं सिर्फ डायरेक्टरी नाम लिखना शुरू कर सकता हूं और स्वतः पूर्ण का उपयोग कर सकता हूं और फिर रिटर्न और शेल cdके डायरेक्टरी में प्रेस कर सकता हूं । इतना ठंडा !
माइकल डुरंट

6
महान। एक मिसफिट से बचने के लिए इशारा करने के लिए धन्यवाद।
वॉनब्रांड

3
मैं इसका उपयोग नहीं करता हूं - cdयह टाइप करने के लिए उतना कठिन नहीं है, और जब आप उन्हें अधिक संदर्भ देते हैं तो अधिकांश टैब-पूर्ण तंत्र अधिक स्मार्ट होते हैं।
jw013

प्रशंसा के एक अत्यधिक उद्गार के पीछे, मुझे बस यह कहना चाहिए कि ऑटोकैड वास्तव में सही उत्तर है: D
ल्यूक

autocdShopt बैश संस्करण 4 में जोड़ा गया है तो यह नहीं उपलब्ध MacOS पर (अभी भी बैश संस्करण 3.xx है) जब तक एक वैकल्पिक, नए बैश स्थापित किया गया है (जैसे, homebrew के माध्यम से) है।
क्विन कॉमेंडेंट

2

Autojump उपयोगिता एक सबसे बड़ी मात्रा में प्रयोग निर्देशिका सूची के साथ एक समान तंत्र प्रदान करता है। हालाँकि, इसके लिए टाइपिंग के अतिरिक्त टेडियम की आवश्यकता होती है, jSpaceलेकिन यह अक्सर नहीं की तुलना में अधिक बार अनुमान लगाकर मुआवजा दिया जाता है।

यह DWIM के सबसे करीब है जिसे मैंने आज तक इस्तेमाल किया है।


1

मैंने एक बार इसी तरह के उद्देश्य के लिए एक उपयोगी स्क्रिप्ट बनाई थी, जिसमें फाइंड -एन-सीडी के लिए एक फंक्शन एलसीडी था

आप टाइप करें fcd fooऔर 3 चीजें हो सकती हैं:

  • इस तरह की कोई डायरेक्टरी फू नहीं मिलती है, तो वह वापस आ जाती है "no such directory " $1
  • एक फ़ाइल मिली है: यह परीक्षण करता है कि क्या यह एक निर्देशिका है (या सिर्फ एक फ़ाइल) और यदि ऐसा है, तो यह वहां मौजूद है।
  • एकाधिक फाइलें मिलती हैं - फिर एक चयन प्रस्तुत किया जाता है, जहां आप चयन की संख्या (या वापसी के लिए एक विशेष संख्या) टाइप करते हैं।

यह समान है कि इसमें आपको पूरे रास्ते को टाइप करने की आवश्यकता नहीं है, लेकिन आपने फ़ंक्शन को स्पष्ट रूप से कॉल किया है।

#!/bin/bash
#
# find cd. For input foo, find all directories .../.../foo 
# GPLv3 Stefan Wagner (2010, 2012)
#
# doesn't handle blanks in directory names gracefully.
#
fcd () 
{
    list=$(locate $1 | egrep "/$1$")
    count=$(echo $list | wc -w )
    case $count in 
      0) 
        echo "unknown directory: "$1 && return
        # could search for partial matches Doc => Documentation
        ;;
      1) 
        if [[ -d "$list" ]]; then
        echo "$list";
        cd "$list";
        else
            echo "not a directory: $1"
        fi
        ;;
      *) 
        select directory in $list "/exit/" 
        do
          if [[ "$directory" = "/exit/" ]]; then break; fi
          if [[ -d "$directory" ]]; then
                echo "$directory";
                cd "$directory";
            break
          else
            echo "not a directory: "$1 
          fi
        done     
        ;;
   esac
}

आपके पास sourceफ़ंक्शन ( source fcd.sh! . fcd.sh) है और इसे स्क्रिप्ट के रूप में नहीं कहा जा सकता है, क्योंकि cdयह केवल स्क्रिप्ट के संदर्भ में होगा, और परिष्करण के बाद आप तुरंत अपने शुरुआती डायर में वापस आ जाएंगे।

चूंकि यह साथ काम करता है locate, यह निर्देशिकाओं को खोजने में बहुत तेज़ है (लेकिन हमेशा अप टू डेट नहीं)।

यह निर्देशिका के नामों में शालीनता से रिक्तता को नहीं संभालता है। यदि आपके पास समस्या का एक सुरुचिपूर्ण समाधान है तो मुझे खुशी होगी।


1
सवाल cdबिना किसी कमांड टाइप किए अपने आप हो गया । यह उत्तर टर्मिनल में त्वरित निर्देशिका नेविगेशन के लिए अधिक उपयुक्त है ।
manatwork

2
@ मैनटवर्क: खैर, आप कमांड को बैश के त्रुटि हैंडलर के साथ जोड़ सकते हैं। में /etc/bash.bashrcवहाँ ubuntu में है, एक function command_not_found_handleजो जैसे कि वह संशोधित किया जा सकता है लग रहा है।
उपयोगकर्ता अज्ञात

पकड़ लिया। यह तरीका बहुत बेहतर लगता है।
मैनटवर्क

@ मैनटवर्क: मैं इसे खुद करूंगा, अगर मैं इसे खुद इस्तेमाल करना चाहूंगा। लेकिन अगर मैं निर्देशिका बदलना चाहता हूं, तो मुझे एक छोटी कमांड का उपयोग करना पसंद है, लेकिन अगर मैं कुछ गलत करता हूं, तो मैं शायद ही कभी 3 या 4 अक्षर टाइप करना भूल गया था। इस कार्यक्रम का कदम होना मेरे लिए कष्टप्रद होगा, लेकिन इसका स्पष्ट रूप से उपयोग करना ठीक है।
उपयोगकर्ता अज्ञात

1

यह भी काम करता है,

cdf name_of_file_or_directory

..तो आप खोल में sourced एक कस्टम cdf.sh स्क्रिप्ट (नीचे) की स्थापना की। पैरामीटर के रूप में एक निर्देशिका के लिए, यह स्क्रिप्ट केवल मूल निर्देशिका के लिए मूल निर्देशिका में मिलती है। निम्नलिखित लाइन को अपने .bashrc या .zshrc, जो भी हो में जोड़ें।

source ~/bin/cdf.sh 

और इस कोड को ~ / bin / cdf.sh फ़ाइल में जोड़ें जिसे आपको स्क्रैच से बनाने की आवश्यकता है।

#!/bin/bash

function cdf() {
    THEFILE=$1
    echo "cd into directory of ${THEFILE}"
    # For Mac, replace find with mdfind to get it a lot faster. And it does not need args ". -name" part.
    THEDIR=$(find . -name ${THEFILE} |head -1 |grep -Eo "/[ /._A-Za-z0-9\-]+/")
    cd ${THEDIR}
}

एक पुराने सवाल का शानदार जवाब। मेरा मानना ​​है कि आप एक पुराने प्रश्न को पुनर्जीवित करने के लिए एक बैज प्राप्त करेंगे, और आपका स्वागत है U & L.SE में आपका स्वागत है
eyoung100

0

इसको अपने में रखो ~/.bashrc

  #aliases to cd into the core dirs
  PROJECT_PARENT_DIRS[0]="$HOME/repos"
  #you can make it search more dirs by assigning new indexes to your other root dirs

  for PARENT_DIR in ${PROJECT_PARENT_DIRS[@]} ; do
    if [ -d "$PARENT_DIR" ]; then
      for PROJECT_DIR in $(/bin/ls $PARENT_DIR); do
        if [ ! -z `which $PROJECT_DIR` ]; then
          continue # don't set alias if there is something already a command on the path with the same name
        fi
        if [ -d "$PARENT_DIR/$PROJECT_DIR" ]; then
          alias "$PROJECT_DIR"="cd $PARENT_DIR/$PROJECT_DIR"
        fi
      done
    fi
  done
  #end alias
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.