कमांड लाइन मूव फाइल को डायरेक्टरी पाथ को दोहराए बिना लंबे डायरेक्टरी पाथ के साथ ले जाती है


16

क्या mvदूसरे तर्क में पूर्ण पथ को टाइप किए बिना कमांड निष्पादित करने का कोई तरीका है ?

उदाहरण:

mv my/file/that/has/a/really/long/path/foo.bar some_magic_operator_that_means_the_same_directory/foo.baz


1
किसी भी कारण से आप सिर्फ cdनिर्देशिका और mvवहाँ से नहीं जा सकते ?
जिप्लान

मैं अक्सर खुद को अपने दिन-प्रतिदिन के कार्य में कई निर्देशिकाओं में इस प्रकार की आज्ञाओं को क्रियान्वित करता हुआ पाता हूं। मुझे अक्सर दिए गए मूल निर्देशिका से कई कमांड निष्पादित करने की आवश्यकता होती है।
फ़िनबार

किसी तरह मैंने पाया कि उपयोग !! (डबल विस्मयादिबोधक चिह्न) टर्मिनल में निष्पादित अंतिम कमांड को चलाने के लिए उपयोग करता है। आप अंतिम कमांड में पैरामीटर / टेक्स्ट भी जोड़ सकते हैं लेकिन कभी भी अंतिम कमांड से टेक्स्ट को बदलने / हटाने की कोशिश नहीं की। इसे आज़माएं और यदि आप सफल होते हैं तो मैं इसे एक उत्तर की तरह छोड़ दूंगा। सौभाग्य!
गेप्पेटव्स डी'कोन्स्टोनजो

जवाबों:


32

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

mv my/file/that/has/a/really/long/path/foo.{bar,baz}

में विस्तार होगा:

mv my/file/that/has/a/really/long/path/foo.bar my/file/that/has/a/really/long/path/foo.baz

और फिर mvउन दो तर्कों के साथ चलाया जाता है। ब्रेस विस्तार पर अधिक जानकारी के लिए http://wiki.bash-hackers.org/syntax/expansion/brace देखें ।


3
वह गौरवशाली है। मुझे नहीं पता था कि आप ऐसा कर सकते हैं।
फ़िनबार

5

ब्रेस विस्तार के विकल्प के रूप में, आप बैश शेल के इतिहास विस्तार सुविधाओं का उपयोग कर सकते हैं :

  • ! एक इतिहास विस्तार का परिचय देता है
  • # इवेंट डिज़ाइनर वर्तमान कमांड को दर्शाते हुए
  • $ अंतिम तर्क का जिक्र करते हुए शब्द रचनाकार

आप एक सेड जैसे s/pattern/replacementसिंटैक्स का उपयोग करके विस्तार पर प्रतिस्थापन कर सकते हैं

somecommand path/to/foo.bar !#$:s/.bar/.baz

पूर्व।

$ mv -v somepath/Original/Dir3/SubDir1/foo.bar !#$:s/.bar/.baz
mv -v somepath/Original/Dir3/SubDir1/foo.bar somepath/Original/Dir3/SubDir1/foo.baz
'somepath/Original/Dir3/SubDir1/foo.bar' -> 'somepath/Original/Dir3/SubDir1/foo.baz'

यदि आप विशेष रूप से पथ चाहते हैं (उदाहरण के लिए, mvएक फ़ाइल के लिए एक पूरी तरह से अलग नाम जो प्रतिस्थापन द्वारा आसानी से प्राप्त नहीं होता है), तो आप hसंशोधक का उपयोग कर सकते हैं :

$ mv -v somepath/Original/Dir3/SubDir1/foo.baz !#$:h/baz.foo
mv -v somepath/Original/Dir3/SubDir1/foo.baz somepath/Original/Dir3/SubDir1/baz.foo
'somepath/Original/Dir3/SubDir1/foo.baz' -> 'somepath/Original/Dir3/SubDir1/baz.foo'

readlineअंतिम तर्क को yank करने के लिए कुंजी संयोजनों सहित अन्य विकल्पों के लिए, देखें कि वर्तमान में bash कंसोल पर पैरामीटर में टाइप कैसे दोहराएं?


2

आप कोशिश कर सकते हैं:

pushd .
cd /really/long/directory/name/
mv whatever.1 whatever.2
popd

2

एक चर के साथ

  1. एक चर में निर्देशिका सहेजें: `DIR=./really/long/path/
  2. चाल का उपयोग करें: mv "$DIR"foo.bar "$DIR"foo.bz

एक पंक्ति में: DIR=./really/long/path/; mv "$DIR"foo.bar "$DIR"foo.bz


निर्देशिका बदलना

  1. आप cdउस निर्देशिका में भी जा सकते हैं जिसमें आप काम करना चाहते हैं:cd ./really/long/path
  2. फिर फ़ाइल का नाम बदलें: mv foo.bar foo.bz

एक पंक्ति में: cd ./really/long/path && mv foo.bar foo.bz


1
वह दूसरा परिचित दिखता है ;-)
zpletan

2
&&उस आखिरी वन-लाइनर में सबसे अच्छा उपयोग । अन्यथा, यदि cdविफल रहता है, mvतो गलत निर्देशिका में चलाया जाएगा, संभवतः एक फ़ाइल को ओवरराइट कर रहा है। के साथ cd ./really/long/path && mv foo.bar foo.baz, mvकेवल चलाया जाएगा यदि cdनिर्देशिका बदलने में सफल होता है।
जिरह

-3

आप निर्देशिका नाम को छोटा करने के लिए अन्य नाम दे सकते हैं:

alias src='/directory/name/of/source'
alias dst='/directory/name/of/destination'
mv src dst

1
-1 alias test='/var/log' ; cd testदेता है -bash: cd: test: No such file or directory
zpletan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.