मैं खुद को बहुत दोहरा रहा हूं:
mkdir longtitleproject
cd longtitleproject
क्या निर्देशिका नाम को दोहराए बिना इसे एक पंक्ति में करने का एक तरीका है? मैं यहां बैश पर हूं।
mkdir longtitleprojectतत्पश्चातcd !^
मैं खुद को बहुत दोहरा रहा हूं:
mkdir longtitleproject
cd longtitleproject
क्या निर्देशिका नाम को दोहराए बिना इसे एक पंक्ति में करने का एक तरीका है? मैं यहां बैश पर हूं।
mkdir longtitleprojectतत्पश्चातcd !^
जवाबों:
कोई अंतर्निहित कमांड नहीं है, लेकिन आप आसानी से एक फ़ंक्शन लिख सकते हैं जो 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पिछली कमांड के अंतिम तर्क पर अमल करता है ।mkdirमें cd।ksh, और यह भी काम करता है zsh) "पिछले कमांड के अंतिम शब्द को दोहराएं" के लिए अनुक्रम। मैं इसे अक्सर उपयोग करता हूं।
/a/b/..//वास्तव में काम करेगा, लेकिन नहीं /a/b/../c। फिक्स्ड। मैंने सवाल को व्यापक दर्शकों के सामने रखा है।
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।
यह वन-लाइनर है जिसकी आपको आवश्यकता है। कोई अन्य विन्यास की आवश्यकता:
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)
mkdir foo && cd foo, जो आसान नहीं है।
इस व्यवहार को लिपिबद्ध करने के लिए मेरे साथ ऐसा कभी नहीं हुआ होगा क्योंकि मैं लगभग एक घंटे के आधार पर निम्नलिखित दर्ज करता हूं ...
$ mkdir someDirectory<ENTER>
$ cd !$
जहां बैश कृपया !$अंतिम पंक्ति के अंतिम शब्द के साथ स्थानापन्न करें; यानी लंबी निर्देशिका का नाम जो आपने दर्ज किया है।
इसके अलावा, ऐसी परिस्थितियों में फ़ाइल नाम पूरा करना आपका मित्र है। यदि आपकी नई निर्देशिका फ़ोल्डर में एकमात्र फ़ाइल थी तो एक त्वरित डबल TABआपको फिर से दर्ज किए बिना नई निर्देशिका देगा।
यद्यपि यह अच्छा है कि बैश आपको इस तरह के सामान्य कार्यों को स्क्रिप्ट करने की अनुमति देता है क्योंकि अन्य उत्तर बताते हैं कि मुझे लगता है कि कमांड लाइन संपादन सुविधाओं को सीखना बेहतर है जो बैश की पेशकश करना है ताकि जब आप किसी अन्य मशीन पर काम कर रहे हों तो आप वाक्य रचना को याद नहीं कर रहे हैं चीनी जो आपकी कस्टम स्क्रिप्ट प्रदान करती है।
के अनुसार क्या अनुकूलन आप उत्पादकता बढ़ाने के लिए अपने खोल प्रोफ़ाइल पर क्या किया है? , यह मेरा इसे करने का तरीका है:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
इसका मतलब यह है कि यह भी काम करता है अगर निर्देशिका पहले से मौजूद है।
-pMkdir का विकल्प त्रुटियों को दबा देगा।
mcdकमान क्या है ? कौन सा पैकेज या प्रोजेक्ट इस कमांड को प्रदान करता है?
यदि आप ओह माई ज़ीश का उपयोग करते हैं, तो एक कमांड है जिसे टेक कहा जाता है जो वास्तव में ऐसा करता है। यह कुछ इस तरह दिखेगा।
take myfolder
मुझे वास्तव में यह दुर्घटना से मिला। मैं सिर्फ देखा और उस पर सूचीबद्ध है इस cheatsheat ओह माई Zsh GitHub विकी है। यह काफी उपयोगी कमांड है, और जाहिर तौर पर खुद को बनाने में बहुत आसान है।
take:) के बारे में कभी नहीं जानता था ! btw - ओह मेरे Zsh के साथ iTerm2। यहाँ वास्तव में 3 सही उत्तर हैं। यह एक, @ jesús-carrera, और चयनित जवाब से एक है। आपके सेटअप और वरीयता पर निर्भर करता है।
यहाँ एक मामूली रूपांतर है जो उल्लेख के योग्य है:
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एक विकल्प के रूप में उपयोग प्रस्तुत कर रहा हूं ।
mkcdएक पंक्ति में अपने वातावरण के लिए कमांड बनाएँ
echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
मैंने एक स्क्रिप्ट बनाई जो डायरेक्टरी बनाती है और फिर cd की है, तो मैंने इसे एक उपनाम दिया। और यहाँ एक सार है जहाँ मैं इसका वर्णन करता हूँ।
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
बस उपरोक्त उत्तरों को स्वचालित करें और एक बार निष्पादन योग्य स्क्रिप्ट बनाएं:
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। स्वीकृत उत्तर पर इसका क्या लाभ है? ……………………………………………………… पी एस यह मुद्दों को उद्धृत करने के कारण विफल हो जाएगा, जो मुझे बताता है कि आपने खुद भी कोशिश नहीं की है।
mcdसे unix.stackexchange.com/questions/6628/...