The नाम ’और difference mv’ में क्या अंतर है?


12

यह पूरी तरह से मेरे लिए स्पष्ट नहीं है, लेकिन दोनों के बीच क्या अंतर है mvऔर rename(से util-linux-ng 2.17.2के रूप में /usr/bin/rename)? क्या renameनियमित अभिव्यक्तियों को स्वीकार करने से परे एक के ऊपर एक फायदे हैं और mvनहीं? मेरा मानना ​​है कि renameएक ही बार में कई फ़ाइल नामों को संभाल सकता है, जबकि mvऐसा नहीं करता है।

मुझे उनके manपन्नों में स्पष्ट संकेत नहीं मिला कि वे अपने आप से अलग या किसी जाँच के माध्यम से क्या स्थापित करते हैं।


2
आइए सुनिश्चित करें कि हम उन्हीं चीजों के बारे में बात कर रहे हैं; से type -a renameऔर आउटपुट क्या हैं rename --version?
जेफ स्कालर

@JeffSchaller यह मेरी ओर से एक जिज्ञासा का अधिक हिस्सा है, लेकिन मेरी एक * निक्स मशीनों पर rename is /usr/bin/renameऔर मुझे rename (util-linux-ng 2.17.2)क्रमशः मिलता है।
उरदा

6
वहाँ कुछ अलग नाम हैं , और यह एक उपनाम / फ़ंक्शन / स्क्रिप्ट हो सकता है, इसलिए मैं सिर्फ यह सुनिश्चित करना चाहता था कि हम जानते थे कि यह क्या था। धन्यवाद! कृपया अपने प्रश्न में उन आउटपुट को संपादित करने के लिए स्वतंत्र महसूस करें।
जेफ स्कालर

@JeffSchaller कोई चिंता नहीं है, वास्तव में यह लिंक एक था जिसे मैंने अभी पाया है कि मुझे पता चला है renameकि अलग-अलग डिस्ट्रोस में अलग-अलग चीजें हो सकती हैं।
उरेडा

5
ऐसा लगता है जैसे आपके प्रश्न में इसका उत्तर है। "एक जेट और एक तिपहिया के बीच क्या अंतर है, इस तथ्य के अलावा कि एक जेट उड़ सकता है , और कई हजार गुना तेजी से जा सकता है?" :
जी-मैन का कहना है कि मोनिका '

जवाबों:


21

यह मूल रूप से यह ढक्कन पर क्या कहता है, दोनों के लिए है।

mvकिसी दिए गए लक्ष्य के लिए एक या अधिक फ़ाइलों को स्थानांतरित करने के लिए एक मानक उपयोगिता है । यह एक फ़ाइल का नाम बदलने के लिए इस्तेमाल किया जा सकता है, अगर वहाँ केवल एक फ़ाइल को स्थानांतरित करने के लिए है। यदि कई हैं, तो mvकेवल तभी काम करता है जब लक्ष्य निर्देशिका है, और फ़ाइलों को वहां ले जाता है।

तो mv foo barया तो फ़ाइल चले जाएँगे fooनिर्देशिका के लिए bar(यदि वह मौजूद है), या नाम बदलने fooके लिए bar(यदि barमौजूद नहीं है या एक निर्देशिका नहीं है)। अगर निर्देशिका नहीं है तो mv foo1 foo2 barबस दोनों फाइलों को निर्देशिका में ले जाएँ bar, या शिकायत करें bar

mvrename()फ़ाइलों को स्थानांतरित करने के लिए C लाइब्रेरी फ़ंक्शन को कॉल करेगा , और यदि वह काम नहीं करता है (वे किसी अन्य फाइल सिस्टम में स्थानांतरित किए जा रहे हैं), तो यह फ़ाइलों को कॉपी करेगा और मूल को हटा देगा।

यदि आपके पास सभी है mvऔर आप कई फ़ाइलों का नाम बदलना चाहते हैं, तो आपको शेल लूप का उपयोग करना होगा। कि यहाँ साइट पर पर प्रश्नों की एक संख्या हैं, जैसे देखना यह , यह , और दूसरों


दूसरी ओर, विभिन्न renameउपयोगिताओं व्यक्तिगत रूप से फ़ाइलों का नाम बदल देती हैं

renameसे util-linux जो आप का उल्लेख एक सरल स्ट्रिंग प्रतिस्थापन बनाता है, जैसे rename foo bar *बदल जाएगा foobarकरने के लिए barbar, और asdffooकरने के लिए asdfbarयह करता है नहीं , फिर भी, एक रेगुलर एक्सप्रेशन ले!

पर्ल नाम की उपयोगिता ( या इसके विभिन्न उदाहरण ) फ़ाइल नाम बदलने के लिए एक पर्ल अभिव्यक्ति लेता है। एक सबसे अधिक संभावना एक का उपयोग करेगा आदेश है, जहां पैटर्न है एक रेगुलर एक्सप्रेशन।s/pattern/replacement/

उपयोग-लिनेक्स नाम और पर्ल नाम दोनों का उपयोग एक ही समय में किसी अन्य निर्देशिका में फ़ाइल को स्थानांतरित करने के लिए किया जा सकता है, फ़ाइल नाम में उचित परिवर्तन करके, लेकिन यह थोड़ा अजीब है। न तो rename()फाइलों पर कॉल करने से ज्यादा है , इसलिए एक फाइलसिस्टम से दूसरे में जाने से काम नहीं चलता है।

जिसके लिए renameआपके पास है, यह आपके वितरण पर निर्भर हो सकता है , और / या आपने क्या स्थापित किया है। उनमें से अधिकांश समर्थन करते हैं rename --version, इसलिए यह पहचानने के लिए कि आपके पास कौन सा है।


न केवल 'नियमित अभिव्यक्ति', बल्कि यदि आवश्यक हो तो कार्य करें
गाइल्स क्वेनोट

@GillesQuenot, ठीक है, हाँ, आप rename '$_=lc' *फ़ाइल नाम कम करने के लिए जैसे कर सकते हैं । लेकिन मुझे लगता है कि सबसे आम मामला है s///(जिसका मैंने उल्लेख किया है) और इसका पैटर्न हिस्सा एक रेगेक्स है; मुझे नहीं लगता कि आप वहां फंक्शन का उपयोग कर सकते हैं। आप इसे प्रतिस्थापन भाग में कर सकते हैं, हालाँकि।
इलकाचू

@ मायवथएकेमिया, मैन पेज में पहला उदाहरण मेरे लिए काम करता है (यह सिर्फ दूसरे से अलग चीजें करता है)। इसके अलावा, कारण जो मैंने डेबियन के मैनपेज़ से जोड़ा है, कम से कम वहां यह बहुत स्पष्ट है कि मैन पेज इसके लिए rename.ulहै और उपयोग-लिनेक्स संस्करण के लिए होगा, और किसी अन्य के लिए नहीं।
ilkachachu

@ilkachach, क्या आपको अपने जवाब में या किसी टिप्पणी में उस पहले उदाहरण के लिए एक स्पष्टीकरण जोड़ने का मन है। यह उदाहरण से अलग है, man renameइसलिए यह अच्छा होगा कि आप डेबियन उदाहरण की अपनी समझ को
जानें

@ मायवार्ताअकेडमीया, मैंने माना कि आप rename foo foo0 foo?; rename foo foo0 foo??उदाहरण का मतलब है , क्योंकि मैंने जो दो मैन पेज देखे थे, उनमें केवल यही अंतर था। आदेशों की एक जोड़ी इसलिए काम करती है क्योंकि पहले एक एकल-अंक फ़ाइल नाम के लिए एक शून्य जोड़ता है, और उसके बाद, दूसरा प्रत्येक दो-अंकीय फ़ाइल नाम के साथ (दूसरा) शून्य जोड़ता है। उस दूसरे सेट में पहले कमांड द्वारा बदल दी गई फाइलें शामिल हैं। rename foo foo00 foo?पहले कमांड के रूप में उपयोग करना भी काम करता है, यह सिर्फ एक बार में दो शून्य जोड़ता है।
ilkachachu

2

mvबस फ़ाइल का नाम बदल देता है (इसे किसी अन्य फ़ाइल सिस्टम या पथ पर भी स्थानांतरित कर सकता है)। आप इसे एक पुराना नाम और एक नया नाम देते हैं, और यह फ़ाइल को नए नाम या स्थान में बदल देता है। renameबल्क नामकरण परिवर्तन करने के लिए उपयोग किया जाता है। कहते हैं कि तुम एक हजार फ़ाइलों था, foo000.logके माध्यम से foo999.logऔर आप के लिए उन्हें बदलना चाहते हैं bar000.logके जरिए bar999.log। साथ mvआपको बस इतना करना होगा mv foo000.log bar000.log, mv foo001 bar001.logआदि या फिर एक पटकथा लिखने के। साथ renameआप बस कर rename foo bar foo*.log, और देखा, एक हजार फ़ाइलें एक पल में बदल रहे हैं! बहुत अच्छा। man renameविवरण के लिए फिर से पृष्ठ देखें।


2

mv

यह एक मूल कमांड लाइन है जिसे एक चीज़ को करने के लिए और इसे अच्छी तरह से करने के लिए डिज़ाइन किया गया है (यूनिक्स दर्शन): मूव फाइल (एस) या निर्देशक (एस)

आप हैक कर सकते हैं STDOUTऔर STDIN¹ गंतव्य के लिए उड़ान भरने स्ट्रिंग पर संशोधित करने के लिए है, लेकिन यह सिर्फ है एक स्मार्ट हैक नहीं

नाम बदलें (पर्ल वन)

चेतावनी इसी नाम के अन्य उपकरण हैं जो ऐसा करने में सक्षम हो सकते हैं या नहीं हो सकते हैं, इसलिए सावधान रहें।

जब लोग बात करते हैं rename, तो हम इस बारे में सोचते हैं, एक नहीं ELF, कम शक्तिशाली (जादू?)।

यह बुनियादी नहीं है, यह पर्ल है। आप पर्ल के कुछ कार्यों को पास कर सकते हैं, और यह बेहद शक्तिशाली है।

इस उदाहरण पर विचार करें:

आप फ़ाइलों का एक गुच्छा नाम बदलना चाहते हैं

foobar_1.txt
foobar_2.txt
foobar_3.txt

आप sprintf()इस तरह से अंकों के साथ शून्य को प्रीपेंड कर सकते हैं (regex का उपयोग करके, हे, यह पर्ल है: D):

rename 's/(\d+)/sprintf("%04d", $1)/e' foobar_*.txt

अब आपके पास है :

foobar_0001.txt
foobar_0002.txt
foobar_0003.txt

वास्तव में एक मूल आदेश नहीं है, है ना?

वास्तव में डीआईआर (एस) को स्थानांतरित करने के लिए डिज़ाइन नहीं किया गया है , लेकिन यह ऐसा कर सकता है:

$ mkdir -p /tmp/foo/bar/base
$ touch /tmp/foo/bar/base/file
$ rename 's!/tmp/foo/bar/base/file!/tmp/file!' /tmp/foo/bar/base/file

स्थानांतरित फ़ाइल

/tmp/file

¹ कुछ कोड हम *.stackexchange.*वेबसाइटों पर देखते हैं

यहाँ छवि विवरण दर्ज करें

for FILE in `ls *.txt`
do
    mv ${FILE} `echo ${FILE} | sed 's/anything_ugly/anything_still_ugly/'`
done

यह जाने का रास्ता नहीं है , यह समतल छोटी गाड़ी है, बस यह समझाने के लिए कि सही समय पर सही उपकरण का उपयोग क्यों किया जाए


+1 sprintfनाम बदलने के साथ आईएनजी के लिए
आर्चेमार

-1

एमवी चाल और फ़ाइलों और निर्देशिकाओं का नाम बदलकर उन्हें वापस करेगा; केवल नाम बदलने के लिए फ़ाइलें।

mv में अधिक क्षमताएं और विकल्प हैं। क्षमताओं में अंतर देखने के लिए प्रत्येक के लिए मैन पेज में स्विच देखें। आइए उबंटू 18.04LTS में आदमी का उपयोग करके देखें (आपका माइलेज प्रत्येक पैकेज के संस्करण के आधार पर भिन्न हो सकता है):

एमवी विकल्प (सहायता और संस्करण को छोड़ देना)

   --backup[=CONTROL]  
          make a backup of each existing destination file  

   -b     like --backup but does not accept an argument  

   -f, --force  
          do not prompt before overwriting  

   -i, --interactive  
          prompt before overwrite  

   -n, --no-clobber  
          do not overwrite an existing file  

  If you specify more than one of -i, -f, -n, only the final one takes effect.  

   --strip-trailing-slashes  
          remove any trailing slashes from each SOURCE argument  

   -S, --suffix=SUFFIX  
          override the usual backup suffix  

   -t, --target-directory=DIRECTORY  
          move all SOURCE arguments into DIRECTORY  

   -T, --no-target-directory  
          treat DEST as a normal file  

   -u, --update  
          move only when the SOURCE file is newer than the destination file or when the destination file is missing  

   -v, --verbose  
          explain what is being done  

   -Z, --context  
          set SELinux security context of destination file to default type  

नाम बदलें विकल्प (सहायता और संस्करण को छोड़ देना)

   -s, --symlink   
          Do not rename a symlink but its target.  

   -v, --verbose  
          Show which files where renamed, if any.  

   -n, --no-act  
          Do not make any changes.  

   -o, --no-overwrite  
          Do not overwrite existing files.            

3
'अधिक शक्तिशाली' को परिभाषित करें। नाम बदलकर नाम बदलने का समर्थन करता है?
गिल्स क्वानोट

जैसा कि प्रश्नकर्ता ने कहा, नहीं।
K7AAY

2
वाह, क्या तर्क है
गिलेस कोटेन

1
क्रेडिट देना जहाँ क्रेडिट देय है।
187 पर K7AAY
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.