यूनिक्स: डैश के साथ शुरू होने वाली फाइलें, -


19

ठीक है, मेरे पास डैश के साथ शुरू होने वाली फाइलों का एक गुच्छा है, -। जो इतना अच्छा नहीं है ... और मैं उनका नाम बदलना चाहता हूं। अपने विशेष मामले में मैं उनके सामने एक चरित्र रखना चाहूंगा।

मुझे निम्नलिखित पंक्ति मिली जो काम करनी चाहिए, लेकिन इसकी वजह से यह डैश नहीं है:

for file in -N*.ext; do mv $file x$file; done

यदि मैं echoसामने रखता हूं तो मुझे mvएक गुच्छा मिलता है

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

यह सही है, सिवाय इसके कि यह सोचेंगे कि पहला फ़ाइल नाम विकल्प है। इसलिए जब मैं हटाता हूं echoऔर इसे चलाता हूं तो मुझे बस एक गुच्छा मिलता है

mv: illegal option -- N

मैंने इसे बदलने की कोशिश की है

for file in -N*.ext; do mv "$file" "x$file"; done

लेकिन उद्धरणों को नजरअंदाज कर दिया जाता है। एकल उद्धरण का उपयोग करने की कोशिश की, लेकिन तब चर का विस्तार नहीं किया गया था ... मैं यहाँ क्या करूँ?

अद्यतन: मैंने अब उद्धरणों को उद्धृत करने का भी प्रयास किया है। ऐशे ही:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

और जब मैं इसकी प्रतिध्वनि करता हूं, तो यह सही लगता है, लेकिन जब मैं वास्तव में इसे चलाता हूं तो मुझे मिलता है

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

मुझे अभी कोई सुराग नहीं है कि यह कैसे करना है ... आह


जवाबों:


28

आपको mv कमांड --बताने के लिए कीवर्ड का उपयोग करने की आवश्यकता है कि तर्क को विकल्प के रूप में व्याख्यायित नहीं किया जाना है। घड़ी:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

कमांडलाइन पर सभी विकल्पों के -- बाद उपयोग करें । उदाहरण के लिए, यदि आप एमवी के -iविकल्प का उपयोग करने का प्रयास कर रहे हैं, तो यह पहले चला जाएगा : --

mv -i -- -filename-begins-with-dash newfilename

6
आह। उस एक के बारे में बिल्कुल नहीं सोचा था। इस बीच मुझे पता चला कि मैं ./फिल्म के नाम के साथ भी चिपक सकता हूं , जो काम करेगा। लेकिन यह निश्चित रूप से एक समान विकल्प है :)
Svish

@ सविश: यह उचित है, मैंने ./किसी के साथ फ़ाइल नाम रखने के बारे में नहीं सोचा । लेकिन आप सही हैं, वह भी इस स्थिति के लिए काम करता है।
क्वैक कोटेकोटे

7
ध्यान दें कि --अर्थ आगे तर्कों को संसाधित नहीं करता है क्योंकि विकल्प एक सम्मेलन है, और सभी कार्यक्रमों द्वारा सम्मानित नहीं किया जाता है। कुछ उस के लिए एक अकेला उपयोग -करते हैं, और कुछ उस उद्देश्य के लिए कुछ भी स्वीकार नहीं करते हैं । इसलिए पहले ./से ध्यान रखने योग्य है।
dmckee

@ मार्की सही है; --विशेष तर्क के रूप में एक GNU एक्सटेंशन है, लेकिन इसका उल्लेख POSIX दिशानिर्देशों में किया गया है। अनुभाग 12.2, दिशानिर्देश 10 देखें: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... इसका मतलब है कि आप अधिवेशन का सम्मान करने के लिए अधिकांश POSIX और GNU उपयोगिताओं की अपेक्षा कर सकते हैं, लेकिन अन्य नहीं कर सकते।
क्वैकोट क्वोटोट

6

एक अन्य तकनीक फ़ाइल नाम के साथ मूल निर्देशिका को शामिल करना है ...

फ़ाइल का नाम बदलने के लिए 'फ़ाइल से नाम बदलकर' फ़ाइल-से-नाम बदलने के लिए ...

mv  ../parent-dir/-file-to-rename  file-to-rename

थैंक्यू @Skippy le ग्रैंड गौरौ। पुष्टि की है कि ./-file-to-rename के साथ mvऔर के rmरूप में काम करता है ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename

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