बैश में, मैं पथ को दोहराए बिना किसी फ़ाइल का नाम कैसे बदल सकता हूं? [डुप्लिकेट]


39

संभावित डुप्लिकेट: बैश कमांड पर टेक्स्ट का पुन :
उपयोग करें

यदि मैं एक फ़ाइल को कुछ निर्देशिकाओं का नाम बदलना चाहता हूं, तो मैं पथ को दोहराने से कैसे बच सकता हूं?

उदाहरण के लिए:

mv path/to/old_filename.txt path/to/new_filename.txt

मैं सोच रहा था कि क्या इसे बनाने का कोई तरीका है:

mv path/to/old_filename.txt (?)new_filename.txt

जहां (?)"एक ही निर्देशिका में" कहने का कोई तरीका होगा।

जवाबों:


26

बैश इतिहास विस्तार का उपयोग करना :

mv path/to/oldfile !#:1:h/newfile

जहां का !#:1:hअर्थ है: वर्तमान में आप जिस पंक्ति से टाइप कर रहे हैं ("! #"), पहले शब्द (": 1") को लें, फिर उसमें से केवल पथ घटक (": h" - शीर्ष) लें।


यह वह मूल प्रश्न है जो मूल प्रश्नकर्ता ने माना कि समाधान हो सकता है, और यह जानना उपयोगी है, इसलिए +1।
पागल

2
ठंडा! मुझे लगता है कि डार्थ की ब्रेस विस्तार विधि आसान है, लेकिन यह वही है जो मैंने पूछा था।
नाथन लॉन्ग

मैंने आज दो महान नई चीजें सीखी हैं। इसके अलावा, मैं हमेशा ब्रेस विस्तार को "डार्थ के ब्रेस विस्तार" के रूप में सोचूंगा क्योंकि यह भयानक लगता है।
पाइलऑफमश

62

आप ब्रेस विस्तार का उपयोग कर सकते हैं: mv path/to/{old_filename.txt,new_filename.txt}

यहाँ bash शेल में ब्रेस विस्तार पर GNU गाइड का लिंक दिया गया है, जो स्थानापन्न की एक सूची को परिभाषित करता है और प्रत्येक बार दोहराए जाने पर एक अलग विकल्प का उपयोग करके पैरामीटर को दोहराने के लिए बैश बताता है।

उदाहरण के लिए,

a{b,c,dd,e}

तक विस्तारित किया जाएगा

ab ac add ae

एकमात्र चेतावनी यह है कि लक्षित कार्यक्रम के तर्क के रूप में विस्तारित दोहराव एक दूसरे का पालन करने में सक्षम होना चाहिए।


5
या इसे न्यूनतम रखना mv path/to/{old,new}_filename.txt:। यह कमांड के उत्क्रमण या पुनरावृत्ति को रोकने में भी मदद करता है। मैंने कई बार किया है जैसे mv /etc/X11/xorg.conf{,.backup}, सरल परिवर्तन द्वारा प्रक्रिया को उलटने में सक्षम होना mv /etc/X11/xorg.conf{.backup,}
डैनियल एंडरसन

26

ऊपर डार्थ का उत्तर चतुर है, लेकिन यदि आप एक दृष्टिकोण का उपयोग करना चाहते हैं, तो आप cdएक उप-भाग का उपयोग करने पर भी विचार कर सकते हैं:

(cd path/to && mv old_filename.txt new_filename.txt)

चूँकि निर्देशिका परिवर्तन सबस्क्रिप्शन में होता है, आप वास्तव में निर्देशिका को अपने इंटरैक्टिव शेल में नहीं बदलेंगे।


1
महत्वपूर्ण दोष: आप टैब-पूर्णता का उपयोग नहीं कर सकते old_filename.txt
bluenote10

9

एक अन्य विकल्प जो उपयोगी है, यदि आप निर्देशिका में कई कमांड करने जा रहे हैं, तो यह है:

pushd /path/to
mv oldfile newfile
...
popd

5

मुझे @ डार्थ का जवाब पसंद है । यहाँ एक विकल्प है:cd path/to && mv oldfile newfile && cd -


1
ध्यान दें कि यदि mvविफल रहता है (उदाहरण के लिए, कोई अनुमति नहीं) तो आपको path/toनिर्देशिका में छोड़ दिया जाएगा । आप cd path/to && mv oldfile newfile ; cd -यह सुनिश्चित करने cd -का प्रयास कर सकते हैं कि हमेशा चला जाए, अगर cd path/to(कोई अनुमति नहीं) विफल रहता है, तो आप अभी भी निष्पादित करेंगे cd -और पिछली निर्देशिका में जाएंगे जो अवांछित है। mlc (+1) का उप-उत्तर बेहतर है। मुझे लगता है cd . && cd path/to && mv oldfile newfile ; cd -कि ९९.९% समय काम करेगा ( cd .केवल अगर आप या आपके वर्तमान डायरियों की अनुमति में कोई बदलाव नहीं हुआ है, और इस मामले में एक अलग डायर में जाना एक नतीजे का बुरा नहीं है।
jimbob
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.