लिनक्स एमवी फ़ाइल लंबे नाम के साथ


19

लिनक्स में मैं कभी-कभी इस तरह से फाइलों का नाम बदल देता हूं:

mv dir1/dir2/dir3/file.txt  dir1/dir2/dir3/file.txt.old

ध्यान दें कि मैं केवल फ़ाइल का नाम बदलना चाहता हूं, इसे किसी अन्य निर्देशिका में स्थानांतरित नहीं करता।

क्या कोई कमांड है जो मुझे उस कमांड का शॉर्टहैंड संस्करण करने की अनुमति देगा? मैं कुछ ऐसा सोच रहा हूँ:

mv dir1/dir2/dir3/file.txt  file.txt.old

या हो सकता है कि कुछ भी (जैसे सिर्फ नाम के लिए):

mv dir1/dir2/dir3/file.txt  {}.old

मेरा लक्ष्य फिर से पूरा रास्ता बताना नहीं है।

मुझे पता है कि उन "उदाहरणों" को मैंने लिखा है जो काम नहीं करते हैं, लेकिन यह सिर्फ एक विचार है जिसे मैं पूरा करना चाहता हूं।

मैं निर्देशिका में सीडी करने के लिए नहीं करना चाहती।


8
आप निर्देशिका में क्यों नहीं बदलते? यह तेज है और आपकी समस्या को हल करता है।
माइकल हैम्पटन

मैं एक ही स्थान से कई उपनिर्देशिकाओं के साथ काम कर रहा हूं, यह धीमी है अगर मुझे हर बार इस माता-पिता के पास वापस आना
पड़ता है

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

ध्यान दें कि (cd dir1/dir2/dir3 && exec mv file.txt{,.old})उपप्रकार के बिना कोड के रूप में प्रभावी रूप से एक ही प्रदर्शन है, क्योंकि बाहरी कमांड मंगलाचरण के दौरान आईएनजी से execबचा जाता है fork(), इसलिए आपके पास दोनों तरह से एक कांटा है।
चार्ल्स डफी

जवाबों:


45

एक एकल फ़ाइल के लिए प्रयास करें

mv dir1/dir2/dir3/file.{txt,txt.old}

जहां X{a,b}निर्माण का विस्तार होता है Xa Xb, आप एक पूर्वावलोकन का उपयोग कर सकते हैं

echo dir1/dir2/dir3/file.{txt,txt.old}

यह देखने के लिए कि क्या यह आपकी आवश्यकता के अनुकूल है।

ध्यान दें:

  1. कई फ़ाइलों के लिए

    mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
    

आप क्या चाहते हैं, इसका विस्तार करने की संभावना नहीं है। (यह file.txt file1.txt.old file2.txt ... के मिश्रित को विस्तारित करेगा)

  1. {txt,txt.old}{,.old}टिप्पणी के अनुसार shorterned किया जा सकता है

  2. यदि निर्देशिका नाम असंदिग्ध है, तो वाइल्डकार्ड का उपयोग किया जा सकता है।

    mv *1/*2/d*/*.{,old}
    

कई फ़ाइल उपयोग के लिए rename

rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt 

-nप्रभावी नाम बदलने के लिए ड्रॉप ।


1
अच्छा, मैं विस्तार का यह तरीका नहीं जानता था! धन्यवाद
arizti सैंटियागो

14
mv dir1/dir2/dir3/file.txt{,.old}काम भी नहीं करेगा , और छोटा भी होगा?
जोश

3
@ जोश हाँ यह पूरी तरह से काम करता है और कम कीस्ट्रोक्स की आवश्यकता होती है। मैं इस निर्माण का उपयोग नियमित रूप से करता हूं।
रैल

2
यह मजेदार है कि आप वर्षों तक लिनक्स शेल का उपयोग कैसे कर सकते हैं और अभी भी हर समय नई तरकीबें खोज सकते हैं
santiago arizti

मुझे लगता है कि अगर मैं बैश भाषा में कुछ औपचारिक प्रशिक्षण लेता, तो मैं उन सभी "ट्रिक्स" को और अधिक स्पष्ट कर सकता था, लेकिन मैं अभी बहुत कुछ सीख रहा हूं।
सैंटियागो एरीज़टी

6

आदेश renameसभी मिलान की गई फ़ाइलों का नाम बदल देता है। इसका मुख्य उद्देश्य कई फ़ाइलों का नाम बदलना है, लेकिन यदि पर्ल अभिव्यक्ति केवल एक फ़ाइल से मेल खाती है, तो यह केवल इस एकल फ़ाइल का नाम बदलेगी। विवरण और डिस्ट्रो विशिष्ट सिंटैक्स के लिए कृपया मेन्यू पढ़ें man rename:।

उदाहरण उपयोग: "/path/file.txt" का नाम बदलकर "/path/file.txt.old":

rename 's/file.txt/file.txt.old/g' /path/file.txt

छोटा संकेतन (शालम्ब का धन्यवाद):

rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt

शुष्क रन उपयोग के लिए rename -n

अधिक उदाहरण और विवरण https://thepcspy.com/read/bulk-rename-files-in-ubuntu/ पर देखे जा सकते हैं


शांत, मैं नाम बदलने के आदेश के बारे में जानता था, बस कभी नहीं जानता था कि यह सब कर सकता है, धन्यवाद!
सैंटियागो अरीज़ती

6
दुर्भाग्य से अलग लिनक्स वितरण में renameपूरी तरह से अलग व्यवहार के साथ अलग-अलग कमांड होते हैं।
कास्परड

1
.oldफ़ाइल नाम के साथ जोड़कर नाम बदलने के इस विशेष कार्य के लिए, शायद यह करने के लिए थोड़ा और अधिक सुविधाजनक है rename 's/$/.old/' /path/to/file.txtयाrename '$_.=".old"' /path/to/file.txt
शालम्ब

@ फैबियन - मैं नाइटपैकिंग नहीं कर रहा था, "ओपी को बार-बार इस्तेमाल किया जाने वाला मुहावरा लगता है" के लिए "सबसे छोटा हाथ" का लक्ष्य है :)
शालम्ब

4

एक बार के मामले के लिए, यदि मैं अपनी वर्तमान निर्देशिका को नहीं बदलना चाहता तो मैं उप-शेल का उपयोग कर सकता हूं:

(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)

क्योंकि आपने cdउप-शेल के अंदर, आपने अपनी वास्तविक शेल में अपनी निर्देशिका नहीं बदली है


4
उपयोग करने के लिए तेज़ और सुरक्षित है && exec mv- इस तरह आप cdविफल होने पर नाम बदलने की कोशिश नहीं करते हैं , और execउप-उपभोग करते हैं, इस प्रकार एक प्रदर्शन दंड से बचते हैं।
चार्ल्स डफी

&& जैसा कि मैंने कहा था, फॉर-वन केस के लिए सहमत हूं, मैं उप-शेल की लागत के बारे में चिंता नहीं करूंगा (इसे सरल रखें: आसानी से याद रखना कि यह कैसे करना महत्वपूर्ण है IMO)
एडम

मेरा तर्क है कि यदि आप केवल एक ही तरीके को याद करने जा रहे हैं, तो कुशल तरीके को याद रखने से यह सुनिश्चित करने में मदद मिलती है कि आप उन मामलों में अक्षम मार्ग पर नहीं जाते जहां यह मायने रखता है।
चार्ल्स डफी

4

मुझे {} विस्तार का उपयोग करने का @ आर्केमर का समाधान पसंद है, क्योंकि आप इसका उपयोग तब कर सकते हैं जब आप अपनी कमांड लाइन शुरू कर चुके हों। पूर्णता के लिए यहां कुछ अन्य संभावनाएं हैं:

F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"

(उद्धरण केवल तभी आवश्यक हैं जब आपके पास नाम में स्थान या अन्य शब्द-ब्रेकिंग वर्ण हों)

mymv() {
    mv "$1/$2" "$1/$3"
}

mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old

टिप्पणियाँ:

  • यह बैश सिंटैक्स है, आप किसी अन्य शेल का उपयोग कर सकते हैं
  • mymv किसी भी उचित स्ट्रिंग हो सकता है, मैं "मेरी चाल" के लिए mymv का उपयोग किया।
  • फ़ंक्शन परिभाषा को आपके .bash_profile में डाला जा सकता है

और एक:

cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -

परंतु

(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)

(@Adam और @CharlesDuffy से) निश्चित रूप से सीडी विफल होने की स्थिति में बेहतर है।


1
उपयोग न करें mmv, पहले से ही इस तरह से नामित एक कार्यक्रम है।
ग्लोगल

1
@glglgl Done :)
Law29

2

यदि आप mvकमांड को छोटा करने के लिए उपनिर्देशिका में प्रवेश करना चाहते हैं , लेकिन बाद में वर्तमान निर्देशिका में वापस आना चाहते हैं, तो ऐसा करने के दो तरीके हैं। एक को cdऔर mvएक उपधारा में रखना है (जैसा कि पहले ही सुझाया जा चुका है)।

अन्य का उपयोग निर्देशिकाओं को बदलने pushdऔर popdकरने के लिए है:

pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd

pushdआदेश की तरह है cd, सिवाय यह पहली बार एक ढेर पर वर्तमान निर्देशिका का नाम धक्का,। popdस्टैक से शीर्ष नाम को हटा देता है और उस निर्देशिका में बदल जाता है।


pushdऔर popdइंटरैक्टिव उपयोग के लिए एक्सटेंशन हैं - पोसिक्स स्पष्ट रूप से उन्हें "परिणाम अनिर्दिष्ट हैं" के रूप में सूचीबद्ध करता है, और स्क्रिप्ट चलाने के लिए बनाया गया एक शेल (न्यूनतम एम्बेडेड वातावरण पर) उन्हें समर्थन की आवश्यकता नहीं है।
चार्ल्स डफी

2

मैं बस करूँगा

cd dir1/dir2/dir3/
mv file.txt file.txt.old
cd ~- # go to the most recent directory

0

इसमें शामिल समाधान: mv something{.txt,.txt.old}"बैशीवाद" का उपयोग कर रहे हैं। यदि आप सामान्य चर जोड़तोड़ का उपयोग करके अधिक पोर्टेबल तरीका चाहते हैं:

# rename all files "file*.txt" of directory /dir1/dir2/dir3 into file*.txt.old:
for f in dir1/dir2/dir3/file*.txt ; do
  mv "$f" "${f/.txt/.txt.old}"  # note there are no terminating "/"
done


# "${var/A/B}" is the content of var with the first occurence of "A" replaced by "B"

2
POSIX विनिर्देशन के लिए pubs.opengroup.org/onlinepubs/009695399/utilities/… देखें - ${var/text/replacement}स्वयं एक बैशवाद है।
चार्ल्स डफी

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