क्या कोई एक-लाइनर है जो मुझे एक निर्देशिका बनाने और एक ही समय में स्थानांतरित करने की अनुमति देता है?


150

मैं खुद को बहुत दोहरा रहा हूं:

mkdir longtitleproject
cd longtitleproject

क्या निर्देशिका नाम को दोहराए बिना इसे एक पंक्ति में करने का एक तरीका है? मैं यहां बैश पर हूं।




1
mkdir longtitleprojectतत्पश्चातcd !^
18:26 पर user262826

जवाबों:


160

कोई अंतर्निहित कमांड नहीं है, लेकिन आप आसानी से एक फ़ंक्शन लिख सकते हैं जो mkdirतब कॉल करता है cd:

mkcd () {
  mkdir "$1"
  cd "$1"
}

इस कोड को अपनी ~/.bashrcफ़ाइल में रखें (या ~/.kshrcksh उपयोगकर्ताओं के लिए, या ~/.zshrczsh उपयोगकर्ताओं के लिए)। यह एक फ़ंक्शन को परिभाषित करता है जिसे कहा जाता है mkcd"$1"जब आप इसे चलाते हैं, तो फ़ंक्शन के तर्क द्वारा प्रतिस्थापित किया जाएगा।

इस सरल संस्करण में कई दोष हैं:

  • आप एक बार में उपनिर्देशिकाओं की श्रृंखला नहीं बना सकते हैं। फिक्स: -pविकल्प को पास करें mkdir। (यह वांछनीय हो सकता है या नहीं भी हो सकता है, क्योंकि यह एक टाइपो के अनिर्धारित होने के जोखिम को बढ़ाता है, उदाहरण के mkcd mydierctory/newsubलिए खुशी से बनायेगा mydierctoryऔर mydierctory/newsubजब आप newsubमौजूदा के अंदर बनाने का मतलब करेंगे mydirectory।)
  • तर्क के साथ शुरू होता है -लेकिन सिर्फ नहीं है -, तो mkdirऔर cdएक विकल्प के रूप में यह व्याख्या करेगा। अगर यह सिर्फ है -, तो cdइसका मतलब करने के लिए व्याख्या करेंगे $OLDPWD। यदि यह +0 या उससे अधिक अंकों का अनुसरण करता है, तो cdzsh में इसे निर्देशिका स्टैक में एक सूचकांक के रूप में व्याख्या करेगा। आप पहले समस्या को ठीक कर सकते हैं, लेकिन अन्य दो --को तर्क से पहले पारित करके नहीं । आप इन सभी समस्याओं ./को तर्क के बहाने ठीक कर सकते हैं यदि यह एक सापेक्ष पथ है।
  • mkdirका पालन नहीं करता है CDPATH, लेकिन cdअगर आपने CDPATHएक ऐसे मूल्य पर सेट किया है, जो शुरू नहीं होता है .(एक सामान्य रूप से कुछ हद तक असामान्य कॉन्फ़िगरेशन), तो cdआप उसे एक अलग निर्देशिका में ला सकते हैं जो अभी बनाया गया था। Prepending ./संबंधित पथ को यह ठीक करता है (यह कारण बनता है CDPATHपर ध्यान नहीं दिया जा करने के लिए)।
  • यदि mkdirविफल रहता है, तो यह निष्पादित करने का प्रयास करता है cd। फिक्स: &&दो कमांड को अलग करने के लिए उपयोग करें।

अभी भी काफी सरल:

mkcd () {
  case "$1" in /*) :;; *) set -- "./$1";; esac
  mkdir -p "$1" && cd "$1"
}

इस संस्करण में अभी भी cdएक से एक अलग निर्देशिका में जाने की क्षमता है जो mkdirसिर्फ एक किनारे के मामले में बनाई गई है: यदि तर्क में mkcdसमाहित है ..और एक प्रतीकात्मक लिंक के माध्यम से जाता है। उदाहरण के लिए, यदि वर्तमान निर्देशिका है /tmp/hereऔर mylinkएक प्रतीकात्मक लिंक है /somewhere/else, तो mkdir mylink/../fooबनाता है /somewhere/else/fooजबकि में cd mylink/../fooबदल जाता है foo। यह तर्क में प्रतीकात्मक लिंक देखने के लिए पर्याप्त नहीं है, क्योंकि शेल अपने स्वयं के वर्तमान निर्देशिका में प्रतीकात्मक लिंक को भी ट्रैक cd /tmp/mylink; mkdir ../foo; cd ../fooकरता है , इसलिए नई निर्देशिका ( /somewhere/else/foo) में नहीं बदलता है /tmp/foo। इसके लिए एक फिक्स है कि cdबिल्टिन को सभी ..पथ घटकों को पहले हल करने दें ( foo/..यदि इसका उपयोग करने का कोई मतलब नहीं हैfooमौजूद नहीं है, इसलिए mkdirकभी कोई देखने की जरूरत नहीं है ..)।

अगर थोड़ा गैरी संस्करण है तो हम इस मजबूत पर आते हैं:

mkcd () {
  case "$1" in
    */..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
    /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
    /*) mkdir -p "$1" && cd "$1";;
    */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
    ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
    *) mkdir -p "./$1" && cd "./$1";;
  esac
}

(व्यायाम: मैं पहली cdकॉल के लिए एक उपखंड का उपयोग क्यों कर रहा हूं ?)

अगर mkdir विफल रहता है, तो मैं यह सुनिश्चित करना चाहता हूं कि वर्तमान निर्देशिका को नहीं बदला जाए। यदि cd के पास अपनी वर्तमान निर्देशिका में बदलने की अनुमति नहीं है, तो cd - या $ OLDPWD के साथ वापस बदलना पर्याप्त नहीं है। इसके अलावा, cd अपडेट को OLDPWD कहते हैं, इसलिए हम केवल इसे एक बार करना चाहते हैं (या OLDPWD को पुनर्स्थापित करें)।


पिछली पंक्ति से शब्द को फिर से लिखने के लिए कम विशिष्ट तरीके नहीं हैं:

  • पिछला कमांड से अंतिम तर्क सम्मिलित करने के लिए टाइप करें cd , फिर Esc .(या Alt+ .)।
  • cd !$cdपिछली कमांड के अंतिम तर्क पर अमल करता है ।
  • प्रेस Upपिछले कमांड लाइन याद करने के लिए है, तो बदलने के लिए इसे संपादित mkdirमें cd

धन्यवाद! एस्क। मेरे लिए सबसे सुविधाजनक लगता है, क्या मुख्य अनुक्रम का कोई विशेष अर्थ है?
मेथोडिफिकेशन

यह सिर्फ बैश है (और विरासत में मिला है ksh, और यह भी काम करता है zsh) "पिछले कमांड के अंतिम शब्द को दोहराएं" के लिए अनुक्रम। मैं इसे अक्सर उपयोग करता हूं।
गाइकोसॉरस

30
@ मुझे लगता है कि "गिल्स" खाता वास्तव में विशेषज्ञों के एक पैनल द्वारा साझा किया गया है। ;-)
कीथ

@StephaneChazelas /a/b/..//वास्तव में काम करेगा, लेकिन नहीं /a/b/../c। फिक्स्ड। मैंने सवाल को व्यापक दर्शकों के सामने रखा है।
गाइल्स

1
mkcd() { mkdir -p "$1" && cd "$1"; }(मेरे उदाहरण के) zsh में एक समस्या नहीं लगती है। mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd(इसमें सेटअप और) डिस्प्ले शामिल हैं /tmp/here/fooजो कि बनाया गया था (और मुझे उम्मीद थी)। bashगलत तरीके से बनाता है और बदल जाता है /var/tmp/somewhere/foo
एडम काटज

133

यह वन-लाइनर है जिसकी आपको आवश्यकता है। कोई अन्य विन्यास की आवश्यकता:

mkdir longtitleproject && cd $_

$_चर, बैश में, पिछले आदेश को दिया अंतिम तर्क है। इस स्थिति में, आपके द्वारा बनाई गई निर्देशिका का नाम। जैसा कि समझाया गया है man bash:

_         At  shell  startup,  set to the absolute pathname used to invoke
          the shell or shell script being executed as passed in the  envi
          ronment  or  argument  list.   Subsequently, expands to the last
          argument to the previous command, after expansion.  Also set  to
          the  full  pathname  used  to  invoke  each command executed and
          placed in the environment exported to that command.  When check
          ing  mail,  this  parameter holds the name of the mail file cur
          rently being checked."$_" is the last argument of the previous command.

cd $_पिछली कमांड के अंतिम तर्क को पुनः प्राप्त करने के लिए उपयोग करें cd !$क्योंकि शेल इतिहास मेंcd !$ पिछली कमांड का अंतिम तर्क देता है :

cd ~/
mkdir folder && cd !$

आप घर खत्म (या ~ /)

cd ~/
mkdir newfolder && cd $_

आप घर के नीचे newfolder में अंत !! (या ~ / newfolder)


23
क्यों पृथ्वी पर यह एक स्वीकृत जवाब नहीं है
जेस्मिथ

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

मुझे लगता है कि ओपी दो आदेशों का उपयोग करने से बचने की कोशिश कर रहा है। यह उत्तर ऐसा करने के रूप में मान्य (लगभग) है mkdir foo && cd foo, जो आसान नहीं है।
जोसेमिग्लस

7
ओपी एक-लाइनर के लिए पूछ रहा है जिसे निर्देशिका नाम को दोहराने की आवश्यकता नहीं है, और यह यह है
जेसु कैरेरा

यह पारंपरिक वन-लाइनर है जिसका आप उल्लेख कर रहे हैं या डॉक्स / ट्यूटोरियल में दूसरों का उपयोग करते देखा है। यहाँ वास्तव में 3 सही उत्तर हैं। यह एक, @ जोर्डन-हैरिस, और चयनित उत्तर के आधार पर। आपके सेटअप और वरीयता पर निर्भर करता है।
वेड

30

इस व्यवहार को लिपिबद्ध करने के लिए मेरे साथ ऐसा कभी नहीं हुआ होगा क्योंकि मैं लगभग एक घंटे के आधार पर निम्नलिखित दर्ज करता हूं ...

$ mkdir someDirectory<ENTER>
$ cd !$

जहां बैश कृपया !$अंतिम पंक्ति के अंतिम शब्द के साथ स्थानापन्न करें; यानी लंबी निर्देशिका का नाम जो आपने दर्ज किया है।

इसके अलावा, ऐसी परिस्थितियों में फ़ाइल नाम पूरा करना आपका मित्र है। यदि आपकी नई निर्देशिका फ़ोल्डर में एकमात्र फ़ाइल थी तो एक त्वरित डबल TABआपको फिर से दर्ज किए बिना नई निर्देशिका देगा।

यद्यपि यह अच्छा है कि बैश आपको इस तरह के सामान्य कार्यों को स्क्रिप्ट करने की अनुमति देता है क्योंकि अन्य उत्तर बताते हैं कि मुझे लगता है कि कमांड लाइन संपादन सुविधाओं को सीखना बेहतर है जो बैश की पेशकश करना है ताकि जब आप किसी अन्य मशीन पर काम कर रहे हों तो आप वाक्य रचना को याद नहीं कर रहे हैं चीनी जो आपकी कस्टम स्क्रिप्ट प्रदान करती है।


1
क्या इस तरह के सबसे महत्वपूर्ण बैश quirks के बारे में पता लगाने के लिए एक अच्छी जगह है?
डोमिसिब्री

@ dominicbri7 आम तौर पर "बैश कमांड लाइन एडिटिंग" के अंतर्गत आता है। Googling एक ही परिणाम के रूप में निम्नलिखित देता है। web.mit.edu/gnu/doc/html/features_7.html विशेष रूप से! $ Word Designator देखें gnu
रोब

17

के अनुसार क्या अनुकूलन आप उत्पादकता बढ़ाने के लिए अपने खोल प्रोफ़ाइल पर क्या किया है? , यह मेरा इसे करने का तरीका है:

# make a directory and cd to it
mcd()
{
    test -d "$1" || mkdir "$1" && cd "$1"
}

इसका मतलब यह है कि यह भी काम करता है अगर निर्देशिका पहले से मौजूद है।


4
-pMkdir का विकल्प त्रुटियों को दबा देगा।
ग्लेन जैकमैन

1
mcd एक पहले से मौजूद कमांड है। हालाँकि आपने अभी एक उदाहरण दिया है, मैंने इसे स्वयं प्रयोग किया है क्योंकि यह mkcd से छोटा अक्षर है।
धर्मित

@ धर्म शाह: मौजूदा mcdकमान क्या है ? कौन सा पैकेज या प्रोजेक्ट इस कमांड को प्रदान करता है?
मिकेल

2
mtools mcd कमांड प्रदान करता है। इसके मैन पेज का कहना है "MS-DOS डिस्क पर mtools वर्किंग डायरेक्टरी को बदलने के लिए mcd कमांड का उपयोग किया जाता है।"
धर्मित

13

यदि आप ओह माई ज़ीश का उपयोग करते हैं, तो एक कमांड है जिसे टेक कहा जाता है जो वास्तव में ऐसा करता है। यह कुछ इस तरह दिखेगा।

take myfolder

मुझे वास्तव में यह दुर्घटना से मिला। मैं सिर्फ देखा और उस पर सूचीबद्ध है इस cheatsheat ओह माई Zsh GitHub विकी है। यह काफी उपयोगी कमांड है, और जाहिर तौर पर खुद को बनाने में बहुत आसान है।


1
मैं take:) के बारे में कभी नहीं जानता था ! btw - ओह मेरे Zsh के साथ iTerm2। यहाँ वास्तव में 3 सही उत्तर हैं। यह एक, @ jesús-carrera, और चयनित जवाब से एक है। आपके सेटअप और वरीयता पर निर्भर करता है।
वेड

3

या आप केवल एक छोटा-सा वैरिएबल ऑन-द-फ्लाई बना सकते हैं और इसे दो बार उपयोग कर सकते हैं x = longproject ; mkdir $x ; cd $x- जो मैं मानता हूं कि एक शेलस्क्रिप्ट का उपयोग करने की तुलना में अभी भी लंबा है :)


0

यहाँ एक मामूली रूपांतर है जो उल्लेख के योग्य है:

function mkdir() {
    local dir=$1
    command mkdir "$dir"  &&  cd "$dir"
}

इसे अपने में जोड़ें ~/.bash_profileऔर आप mkdirसामान्य (एक बार जब आप sourceइसे ले सकते हैं) के रूप में उपयोग कर सकते हैं, सिवाय अब यह मानक mkdirकमांड के बजाय फ़ंक्शन को ऊपर चलाएगा ।

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

डॉक्स से (थोड़ा सा विरोधाभास):

command mkdir [args]नामित किसी भी शेल फ़ंक्शन mkdirको argsअनदेखा करने के साथ चलता है mkdir। केवल शेल बिल्ट कमांड या PATH की खोज के द्वारा मिलने वाले कमांड निष्पादित होते हैं। यदि कोई शेल फ़ंक्शन है ls, command lsतो फ़ंक्शन के भीतर चल रहा है, फ़ंक्शन को lsपुनरावर्ती रूप से कॉल करने के बजाय बाहरी कमांड निष्पादित करेगा

मेरा मानना ​​है कि builtinएक समान परिणाम प्राप्त होता है command


आप निश्चित रूप से बोली चाहिए$dir
जेफ स्कालर

@ जेफ, सहमत हैं, लेकिन स्वीकृत जवाब के लिए सभी सत्यापन की आवश्यकता होगी। मैं केवल commandएक विकल्प के रूप में उपयोग प्रस्तुत कर रहा हूं ।
अरज

0

BASH, ZSH या KSH में सहायक फ़ंक्शन को जोड़ना

mkcdएक पंक्ति में अपने वातावरण के लिए कमांड बनाएँ

echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc


-1

बस उपरोक्त उत्तरों को स्वचालित करें और एक बार निष्पादन योग्य स्क्रिप्ट बनाएं:

fun='
mkcd ()
{
    mkdir -p -- "$1" && cd -P -- "$1"
}'

echo "$fun" >> ~/.bashrc

बस इसे एक नई फ़ाइल में कॉपी करें mkcd.shऔर इसे टर्मिनल में केवल एक बार चलाएं bash mkcd.sh। फिर source ~/.bashrcइसे चालू सत्र में काम करने के लिए निष्पादित करें।

इसके बाद, आप mkcd some_dirसीधे उस निर्देशिका में बनाने और दर्ज करने के लिए उपयोग कर सकते हैं ।


आप एक स्क्रिप्ट (एक फ़ाइल में) लिखने का सुझाव देते हैं जिसका एकमात्र उद्देश्य ~/.bashrcफ़ाइल में संलग्न करना है (एक उत्तर के साथ जो पहले ही दिया जा चुका है)? और आप इस mkcd.shस्क्रिप्ट को बनाने का सुझाव कैसे देते हैं ? एक संपादक के साथ, शायद? यह सिर्फ संपादन से ज्यादा काम की तरह दिखता है ~/.bashrc। स्वीकृत उत्तर पर इसका क्या लाभ है? ……………………………………………………… पी एस यह मुद्दों को उद्धृत करने के कारण विफल हो जाएगा, जो मुझे बताता है कि आपने खुद भी कोशिश नहीं की है।
स्कॉट

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

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