उद्धरणों के बिना फाइलों में किन वर्णों के भाग जाने की आवश्यकता है?


12

मेरे पास ब्राउज़र-आधारित शेल / टर्मिनल है जो बैश कमांड को निष्पादित करता है और मैं रिक्त स्थान से बच रहा हूं लेकिन यह पता चला है कि कोष्ठक से भी बचने की आवश्यकता है। फ़ाइल नाम जो उद्धरणों में नहीं हैं उनके लिए अन्य वर्णों से बचने की क्या आवश्यकता है?


यह बिल्कुल स्पष्ट नहीं है कि आप क्या करने की कोशिश कर रहे हैं। और कुछ के साथ क्या करने के लिए स्वत: पूर्णता मिली है?
माइकल व्हीकल्स

@MichaelVehrs मेरे पास mv filename filename-fooबैश में कमांड है, मुझे रिक्त स्थान और कोष्ठक के अलावा किन पात्रों को भागने की आवश्यकता है?
ज्यूबिक

@MichaelVehrs ने स्वतः पूर्ण उल्लेख हटा दिया।
ज्यूकिक

मूल रूप से, सभी शेल मेटाचैकर, जैसे कि व्हाट्सएप, शेल ग्लब्स, इतिहास की घटनाएं। इस कारण से, आपको व्यक्तिगत वर्णों से बचने के बजाय, पूरे फ़ाइल नाम को उद्धृत करना चाहिए mv "$filename" "$newname":।
माइकल व्हील्स

@MichaelVehrs मुझे पता है कि उद्धरण से बचने के साथ समस्या हल हो जाएगी लेकिन मुझे उद्धरण के बिना फ़ाइल नाम का उपयोग करने की आवश्यकता है। मेरे पास टर्मिनल एमुलेटर है और यह तब काम करना चाहिए जब उपयोगकर्ता उद्धरणों का उपयोग नहीं करता है।
जकुबिक

जवाबों:


22

सरल समाधान 'शुरुआत में एक उद्धरण ( ) और अंत में एक अन्य उद्धरण, और '4-वर्ण अनुक्रम द्वारा फ़ाइल नाम के अंदर प्रत्येक वर्ण को बदलने के लिए है '\''। सभी वर्ण एकल-उद्धृत स्ट्रिंग के अंदर अपना विशेष अर्थ खो देते हैं, सिवाय इसके 'कि जो स्ट्रिंग के अंत को चिह्नित करता है। अनुक्रम '\''एकल-उद्धृत शाब्दिक को समाप्त करता है, तुरंत एक उद्धृत एकल उद्धरण द्वारा अनुसरण करता है, और एक नया एकल-उद्धृत शाब्दिक खोलता है। इस प्रकार फ़ाइल का नाम

This file's name has some weird characters!
Will you manage to escape them?

निम्नानुसार उद्धृत किया जा सकता है:

somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'

दोहरे उद्धरण-चिह्नों में अधिक जटिल भागने के नियम हैं और !यदि इतिहास प्रतिस्थापन सक्रिय है तो आपको विस्मयादिबोधक चिह्न शामिल करने की अनुमति नहीं है, इसलिए मैं उन्हें आगे नहीं समझूंगा।

एक वैकल्पिक दृष्टिकोण बैकस्लैश वाले पात्रों की रक्षा करना है। यह नई वर्णमाला को छोड़कर प्रत्येक वर्ण के लिए काम करता है; एक नई पंक्ति के लिए, इसे एकल उद्धरण (या दोहरे उद्धरण) के अंदर रखना एकमात्र उपाय है। यदि आप उपयोगकर्ता को उद्धृत नाम प्रस्तुत करने के लिए बैकस्लैश की संख्या कम से कम करना चाहते हैं, तो आप इसे उन स्थानों पर प्रतिबंधित कर सकते हैं जहाँ बैकस्लैश की आवश्यकता है; हालाँकि, जितने अधिक बैकस्लैश आप छोड़ते हैं, उतने ही अधिक जोखिम को आप भूल जाते हैं। अक्षर, अंक और गैर- ASCII वर्ण हमेशा ठीक हैं। जब भी आप अनिश्चित हों, व्हाट्सएप और विराम चिह्न को उद्धृत करें।

एक विशिष्ट शेल (ksh, bash या zsh) के साथ, आपको कम से कम कुछ परिस्थितियों में निम्नलिखित वर्णों को उद्धृत करना होगा।

  • व्हॉट्सएप (स्पेस, टैब, न्यूलाइन - यह याद रखना कि नए सिरे को बैकस्लैश के साथ उद्धृत नहीं किया जा सकता)।
  • ! - इतिहास विस्तार।
  • " - शेल सिंटैक्स।
  • #- व्हॉट्सएप से पहले टिप्पणी शुरू करें; zsh वाइल्डकार्ड।
  • $ - शेल सिंटैक्स।
  • & - शेल सिंटैक्स।
  • ' - शेल सिंटैक्स।
  • (- एक शब्द के बीच में भी: ksh विस्तारित ग्लब्स (बाश और zsh में भी उपलब्ध); zsh वाइल्डकार्ड।
  • )(देखें ()
  • * - एस वाइल्डकार्ड।
  • , - केवल ब्रेस विस्तार के अंदर।
  • ; - शेल सिंटैक्स।
  • < - शेल सिंटैक्स।
  • = - zsh में, जब यह एक फ़ाइल नाम (PATH लुकअप के साथ फ़ाइल नाम विस्तार) की शुरुआत में है।
  • > - शेल सिंटैक्स।
  • ? - एस वाइल्डकार्ड।
  • [ - एस वाइल्डकार्ड।
  • \ - शेल सिंटैक्स।
  • ] - आप इसे निर्विघ्न छोड़ने से दूर हो सकते हैं।
  • ^- इतिहास का विस्तार; zsh वाइल्डकार्ड।
  • ` - शेल सिंटैक्स।
  • { - ब्रेस विस्तार।
  • | - शेल सिंटैक्स।
  • } - zsh में बच निकलने की जरूरत है, जब कोई मैचिंग ओपनिंग ब्रेस न हो तो अन्य गोले ज्यादा लचकदार होते हैं।
  • ~- घर निर्देशिका विस्तार जब यह एक फ़ाइल नाम की शुरुआत में है; zsh वाइल्डकार्ड; हमेशा सुरक्षित जब यह अंतिम चरित्र है।

कुछ और पात्रों को कभी-कभी विशेष हैंडलिंग की आवश्यकता हो सकती है:

  • -शेल के लिए विशेष नहीं है, लेकिन जब यह कमांड तर्क की शुरुआत में होता है, तो यह एक विकल्प को इंगित करता है। विशेष हैंडलिंग कमांड में नहीं है, इसलिए इसे कोट के साथ संरक्षित नहीं किया जा सकता है, शेल में नहीं। उस फ़ाइल नाम की रक्षा करने के लिए जो इसके साथ शुरू होता है -, आप इसके आगे रख सकते हैं ./- इस तरह यह अभी भी एक ही फ़ाइल है, लेकिन तर्क -अब और नहीं शुरू होता है ।
  • .अपने आप में विशेष नहीं है, लेकिन *डिफ़ॉल्ट रूप से डॉट फ़ाइलों को ग्लब्स से बाहर रखा गया है।
  • :शेल के लिए विशेष नहीं है, लेकिन कुछ कमांड इसे विशेष रूप से पार्स करते हैं, उदाहरण के लिए एक दूरस्थ फ़ाइल ( hostname:filename)। कॉलन वाले फ़ाइल नाम से निपटने के तरीके को देखने के लिए कमांड के प्रलेखन से परामर्श करें।

¹ जब तक उपयोगकर्ता को कॉन्फ़िगर किया वैकल्पिक इतिहास विस्तार अक्षर। कुछ गोले इसकी अनुमति देते हैं। यह बैकस्लैश के बजाय एकल उद्धरण का उपयोग करने का एक और कारण है।


न्यूलाइन्स, कम से कम LFकेवल, कुछ गोले में बैकस्लैश के साथ उद्धृत किया जा सकता है।
ugबग

@ आईबग नंबर किसी भी श-जैसे शेल में, बैकस्लैश + न्यूलाइन एक खाली स्ट्रिंग में फैलता है, न्यूलाइन के लिए नहीं।
गिल्स एसओ- बुराई को रोकना '

यह एक अच्छा जवाब है, धन्यवाद। क्या कोई लिंक है जहां यह जानकारी 'आधिकारिक तौर पर' उपलब्ध है?
स्लैशमाईस

1
@slashmais क्या जानकारी है? शेल भाषा का वाक्यविन्यास "आधिकारिक तौर पर" विभिन्न पुस्तिकाओं और विशिष्टताओं में उपलब्ध है, लेकिन वहां से यह पता लगाने के लिए कि पात्रों को उद्धृत करने की आवश्यकता है जहां पूरी तरह से सीधा नहीं है।
गिल्स एसओ- बुराई को रोकना '

1
मैंने यह भी पाया: tecmint.com/manage-linux-filenames-with-special-characters - यह आपकी सूची की तरह कॉम्पैक्ट नहीं है, लेकिन इसके बहुत सारे उदाहरण हैं। (बाय-बाय: "क्या जानकारी?" एक शांत प्रतिक्रिया नहीं है जब यहां विषय पात्रों की चिंता करता है)
स्लैशमाईज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.