तर्क के रूप में एक निर्देशिका के साथ एक कमांड कैसे चलाया जाए, फिर उसी को सीडी? मुझे "ऐसी कोई फ़ाइल या निर्देशिका नहीं मिली"


15

मैं निम्नलिखित कार्य करने के लिए एक छोटा कार्य बनाना चाहता हूं। मान लीजिए कि मैं अपने दस्तावेज़ निर्देशिका में फ़ाइल 'file.tex' को स्थानांतरित करता हूं:

mv file.tex ~/Documents

फिर, मैं cdउस निर्देशिका को पसंद करूंगा :

cd ~/Documents

मैं इसे किसी भी निर्देशिका में सामान्य बनाना चाहता हूं, ताकि मैं ऐसा कर सकूं:

mv file.tex ~/Documents
follow

और followकमांड को पिछले कमांड से गंतव्य को पढ़ें, फिर उसी के अनुसार निष्पादित करें। एक साधारण निर्देशिका के लिए, यह बहुत समय नहीं बचाता है, लेकिन जब नेस्टेड निर्देशिकाओं के साथ काम करते हैं, तो यह सिर्फ उपयोग करने में सक्षम होने के लिए जबरदस्त होगा

mv file.tex ~/Documents/folder1/subfolder1
follow

मुझे लगा कि यह अपेक्षाकृत सरल होगा, और मैं ऐसा कुछ कर सकता हूं:

follow()
{
    place=`history 2 | sed -n '1p;1q' | rev | cut -d ' ' -f1 | rev`
    cd $place
}

लेकिन यह काम नहीं करता है। यदि मैं प्रतिध्वनि करता हूं $place, तो मुझे वांछित स्ट्रिंग मिलती है (मैं इसके साथ परीक्षण कर रहा हूं ~/Documents), लेकिन अंतिम कमांड वापस आती है

No such file or directory

निर्देशिका निश्चित रूप से मौजूद है। मुझे हानि हो रही है। क्या आप मेरी मदद कर पाएंगे?


मैं यह बताना चाहता हूं कि यदि आपको file.texमूल स्थान पर रखने में कोई आपत्ति नहीं है , तो सिम्बलिंक्स एक बहुत अच्छा विकल्प है, क्योंकि आपको केवल एक बार लिंक करना है, और फिर यह हमेशा नवीनतम संस्करण की ओर इशारा करेगा।
क्रोल्टन

5
आसान तरीका: पिछली कमांड के अंतिम टोकन को बदलने के लिए cd alt + टाइप करें .। अंतिम टोकन के इतिहास में आगे जाने के लिए दोहराएं। (मैं कहता हूं कि टोकन अर्ग नहीं है, क्योंकि अंतिम टोकन के रूप में foo &पकड़ लेता है &।) आप एक संख्यात्मक तर्क का उपयोग कर सकते हैं (उदाहरण के लिए एस्केप -3 एल + + के साथ)।
पीटर कॉर्ड्स


जवाबों:


18

किसी फ़ंक्शन को परिभाषित करने के बजाय, आप चर का उपयोग कर सकते हैं $_, जिसे पिछले कमांड के अंतिम तर्क तक विस्तारित किया गया है bash। तो उपयोग करें:

cd "$_"

mvआज्ञा के बाद ।

आप इतिहास विस्तार का भी उपयोग कर सकते हैं:

cd !:$

यदि आप एक समारोह का उपयोग करना चाहिए:

follow () { cd "$_" ;}

$ follow () { cd "$_" ;}
$ mv foo.sh 'foo bar'
$ follow 
foo bar$ 

NB: यह उत्तर सटीक कमांड लाइन तर्क प्रारूप के लिए लक्षित है जिसका उपयोग आपने किया है जैसा कि हम स्थितीय मापदंडों के साथ काम कर रहे हैं। अन्य प्रारूपों के लिए mv -t foo bar.txt, आपको पहले से विशिष्ट जाँचों को शामिल करने की आवश्यकता है, एक रैपर तब उपयुक्त होगा।


आपका इतिहास विस्तार (सीडी !: $) पूरी तरह से काम करता है। धन्यवाद। हालाँकि, अन्य (cd "$ _") नहीं है: mv file.tex ~ / डाउनलोड / cd "$ _" bash: cd: __bp_preexec_invoke_exec: ऐसी कोई फ़ाइल या निर्देशिका मैं बहुत खुशी से आपके उत्तर को पूरी तरह से सही मानकर स्वीकार नहीं करूँगा, और धन्यवाद।
अग्नि

मैंने हमेशा ( cd !$या तो बेकार) टाइप किया है या cd $(dirname !$)$_चर के बारे में पता नहीं था !
काल्विन ली

अब अगर मैं इसके mv -t ~/Documents file.texबजाय क्या करूं mv file.tex ~/Documents? नीचे की रेखा, मुझे यकीन नहीं है कि यह सामान्य मामले में हल करने योग्य है ... एक रैपर फ़ंक्शन के आसपास या जो कि mv
पुनरावृत्ति

@ MichaelKjörling काम नहीं करेगा बस..इस उदाहरण के लिए सिर्फ ओपी के पास मामला है, न कि किनारे (या सभी) मामलों को कवर करने का ..
heemayl

आपको बृहदान्त्र की आवश्यकता नहीं है; टाइप करने के !$लिए !:$और तेजी से बराबर है ।
वाइल्डकार्ड

14

मानक बैश कीबाइंडिंग के साथ, संयोजन Alt.पिछली कमांड लाइन के अंतिम तर्क को वर्तमान में कॉपी करेगा। तो, टाइपिंग

$ mv foo ~/some/long/path/
$ cd <Alt><.>

उपज होगी

$ mv foo ~/some/long/path/
$ cd ~/some/long/path/

और शब्द से भी कम टाइपिंग होगी follow

अतिरिक्त सुविधा के लिए, Alt.संयोजन को दोहराना सभी पिछली कमांड लाइनों के अंतिम तर्कों के माध्यम से ब्राउज़ करेगा।

परिशिष्ट: इस कुंजी संयोजन के अनुरूप बैश कमांड नाम है yank-last-argयाinsert-last-argument । यह बैश मैनपेज में "कमांड्स फॉर मैनिपुलेटिंग द हिस्ट्री" के तहत या अधिक एग्जॉस्ट बैश बैश मैनुअल में पाया जा सकता है ।)


1
यह चालाकी है। धन्यवाद! मुझे पता नहीं था कि यह अस्तित्व में है।
अग्नि

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

1
आप <esc>तब भी .परिणाम प्राप्त करने के लिए उपयोग कर सकते हैं <alt>+., यह उपयोगी है जब आपने बचने के लिए
कैपलॉक का उपयोग किया है

1
@gnur vi (m) उपयोगकर्ता, मुझे लगता है। ;-)
डब्यू

6

आप लगभग निश्चित रूप से इस समस्या में चल रहे हैं कि पैरामीटर विस्तार से पहले टिल्ड का विस्तार होता है, जिसे एक संक्षिप्त उदाहरण द्वारा समझाया जा सकता है:

$ cd ~kaz
kaz $ var='~kaz'
kaz $ echo $var
~kaz
kaz $ cd $kaz
bash: cd: ~kaz: No such file or directory

इसके साथ संबोधित किया जा सकता है eval। वैसे भी, आपको ज़रूरत पड़ने वाली है eval, क्योंकि आप इतिहास से कमांड खींच रहे हैं और उनमें मनमाने विस्तार हो सकते हैं, जैसे:

$ mv file.tex ~/Documents/$(compute_folder_name foo-param)/subfolder1
$ follow

(ऐसे मुद्दे हैं, जैसे कि इन मूल्यों का पुन: विस्तार अब होने वाले मूल विस्तार से मेल नहीं खा सकता है। मान लीजिए कि compute_folder_nameयह एक फ़ंक्शन है जो कुछ वैश्विक चर को बढ़ाता है।)


4
आप की जरूरत नहीं है eval। (कभी।) लेकिन विस्तार अनुक्रम समस्याओं पर अच्छा खोलना। यदि आप evalयहाँ उपयोग करने के लिए इतिहास विस्तार की अधिक से अधिक सलाह का उल्लेख करते हैं, तो यह मेरी राय में सबसे अच्छा जवाब होगा; दूसरों में से कोई भी वास्तव में नहीं समझाता है कि मूल पोस्टर का समाधान काम करने में क्यों विफल रहा।
वाइल्डकार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.