फ़ाइल का नामकरण जिसे उसके नाम में एक उद्धरण चिह्न मिला है


11

मुझे थोड़ी तकलीफ हुई। एक क्लाइंट ने मुझे वास्तव में पुराने सर्वर से साइटों के प्रवास का काम सौंपा। पता नहीं वे वहां कैसे पहुंचे, लेकिन 'उनके नाम के साथ फाइलें हैं । क्या फ़ाइल का नाम बदलने का कोई तरीका है? mvचाल करने के लिए प्रतीत नहीं होता है।

ls इसे दिखाता है 90843_O\\'ConnorPaul_GeneralManager.jpg

जब मैं कोशिश करता हूं

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

यह >नई लाइन में कुछ भी नहीं करता है जैसे कि अधिक इनपुट की प्रतीक्षा कर रहा है।

अगर मैं कोशिश करूँ

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

मुझे त्रुटि मिलती है

mv: '90843_O \' ConnorPaul_GeneralManager.jpg 'को स्टेट नहीं कर सकता: कोई नई फ़ाइल या निर्देशिका नहीं

इसके अलावा, क्या कुछ फ़ोल्डर में सभी फ़ाइलों को बदलने \'का सरल तरीका है _?


1
यदि आपके पास अधिक रोग हैं , तो vidirयह इस प्रकार के मुद्दों का एक सरल समाधान है।
derobert

जवाबों:


6

यदि आप सिर्फ टाइप करते हैं mv 90843_Oऔर टैब दबाते हैं, तो बैश टैब पूर्णता यहां सही काम करने में सक्षम होना चाहिए । अन्यथा, नाम से ठीक से बचने का एक तरीका है:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

दोहरे उद्धरण चिह्नों से बचने की आवश्यकता को हटा देते हैं ', लेकिन दो बैकस्लैश पात्रों को अभी भी बच निकलने की आवश्यकता है (प्रत्येक के लिए एक अतिरिक्त बैकस्लैश चार बैकस्लैश बनाता है)। एक अन्य विकल्प है:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

यहाँ सिंगल कोट्स में बैकस्लैश डालने से उन्हें बचने की आवश्यकता दूर हो जाती है, लेकिन आपको शाब्दिक रूप से जोड़ने के लिए सिंगल कोट्स को समाप्त करने की आवश्यकता होती है '। यह उद्धरण समाप्त होने के बाद बच जाता है।

यहाँ ध्यान दें कि एकल उद्धरण के रूप में नाम में बैकस्लैश के साथ करने के लिए बहुत कुछ है। \\'अनुक्रम को बदलने के लिए (क्योंकि प्रश्न में फ़ाइल नाम में दो बैकस्लैश हैं, दोनों समस्याओं का कारण बनेंगे) एक लूप का उपयोग करके सभी फ़ाइलों के लिए एक अंडरस्कोर के साथ:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

-iकर देगा mvसंकेत दिखाई दे कि किसी भी फाइल ओवरराइट किया जाएगा। उपयोग करना prename( renameकई प्रणालियों पर इसके लिंक):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

-nजब आप खुश होते हैं तो उसे हटा दें जो आप चाहते हैं। ध्यान दें कि बैकस्लैश वर्णों को यहां पर्ल अभिव्यक्ति के अंदर से बच जाना चाहिए, भले ही उनके चारों ओर एकल उद्धरण हों (एकल उद्धरण के बिना आपको आठ बैकस्लैश की आवश्यकता होगी क्योंकि चार शेल द्वारा हटा दिए जाएंगे और पर्ल अभिव्यक्ति का हिस्सा नहीं होंगे)।


4

आप renameऐसे कार्यों के लिए उपयोग कर सकते हैं :

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

आप बदलना चाहते हैं 'के लिए _आप भी नाम बदलने का उपयोग कर सकते हैं:

rename "s/\'/_/g" *

-2

Grrr, @Graeme ने मुझे इसके लिए हराया, लेकिन मैं वैसे भी पोस्ट करूंगा ...

यदि आप फ़ाइलनाम को दोहरे उद्धरणों के साथ उद्धृत करते हैं, जैसे mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg, यह चाल करता है; उपयोग -vकरना वैकल्पिक है, लेकिन यह बताएगा कि उसने क्या किया। मेरा मानना ​​है कि सभी चार्ट से बचने के अलावा एक दूसरा तरीका भी है, -if- यह भी संभव है। केवल इस तरह से मैं जानता हूं कि शेल पाठ को संसाधित करेगा क्योंकि यह एकल उद्धरणों के अंदर नहीं है, लेकिन यह आंतरिक कोड नहीं होने के कारण इसे बिल्कुल भी हेरफेर नहीं करता है, और प्रक्रिया में लगने वाला अतिरिक्त समय व्यर्थ है।

बस परीक्षण किया गया है, आप >दोहरे उद्धरण वाले पाठ के भीतर चार की तरह हो सकते हैं और इसे फ़ाइल नाम के भाग के रूप में लिया जाएगा।

भविष्य के लिए एक टिप के रूप में, आप उपयोग कर सकते हैं ./अगर यह एक पानी का छींटा के साथ शुरू फ़ाइलों जैसी समस्याओं देता है, फ़ाइल नाम से पहले सही: mv ./-file fileका नाम बदल देगा -fileकरने के लिए file। इस तरह के मामले में आप अपवाद के रूप में फ़ाइल नाम को उद्धृत या बच नहीं सकते।

विचित्र रूप से पर्याप्त है, मैं फ़ाइल बना सकता हूं 90843_O'ConnorPaul_GeneralManager.jpgयदि मैं एकल उद्धरण से बच गया \', लेकिन यह इसे नहीं बनायेगा यदि यह डबल-उद्धृत या बच नहीं गया था।

पुनश्च: बैश समापन एक और तरीका है, यह आपकी फ़ाइल के साथ फ़ाइल नाम समस्या के आसपास काम करता है, लेकिन यह "डैश" फ़ाइलों / फ़ोल्डरों के साथ काम नहीं करेगा: बस नाम का एक हिस्सा लिखें और टैब को हिट करें, यह बाकी काम करता है।


नीच क्यों? मैं दूसरों के सामने लिख रहा था, लेकिन मैं इसे पोस्ट करने के लिए पर्याप्त जल्दी नहीं था।
रौतामीका

मुझे नहीं था कोई सुराग नहीं जो नीचे मतदान किया।
इगोर याविक

1
यह उत्तर सही नहीं है, यह फ़ाइल नाम में बैकस्लैश की उपेक्षा करता है जो वास्तव में एकल उद्धरण की तुलना में अधिक कठिन हैं।
ग्रीम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.