मैं किसी फ़ाइल या निर्देशिका को उसके नाम के विशेष वर्णों के साथ कैसे दर्ज करूं?


44

मैं टर्मिनल में निम्नलिखित फ़ोल्डर दर्ज करना चाहता हूं:

Milano, Torino (Jan)-Compressed

मुझे cdइस निर्देशिका में प्रवेश करने के लिए कमांड कैसे लिखना चाहिए ?

रिक्त स्थान है और कई अन्य विशेष वर्ण की तरह \, *, ), (और ?कारण समस्याओं जब मैं उन्हें आदेश पंक्ति या स्क्रिप्ट, जैसे में इस्तेमाल करने की कोशिश:

$ cd space dir
bash: cd: space: No such file or directory

$ cat space file
cat: space: No such file or directory
cat: file: No such file or directory

$ cat (
bash: syntax error near unexpected token `newline'

$ echo content >\
> ^C

$ ls ?
(  )  *  ?  \

मैं फ़ाइल या निर्देशिका नाम कैसे दर्ज करूं जिसमें सामान्य रूप से टर्मिनल में विशेष वर्ण हों?


जवाबों:


43

यह आदेश अस्पष्ट है क्योंकि आम तौर पर तर्कों को अलग करने के लिए रिक्त स्थान का उपयोग किया जाता है। सीडी यह नहीं जानता कि आप क्या करना चाहते हैं लेकिन आपको इसे हल करने की दो संभावनाएँ हैं:

या तो आप रिक्त स्थान (और अन्य सभी विशेष वर्णों) को " मुखौटा " करें ताकि टर्मिनल को पता चले कि आप अंतरिक्ष को एक चरित्र के रूप में समझते हैं और विभाजक के रूप में नहीं:

cd Milano\,\ Torino\ \(Jan\)-Compressed

या आप अपना फ़ोल्डर नाम या पथ उद्धरणों में रखें :

cd "Milano, Torino (Jan)-Compressed"

26

थोड़ा सा टिप: टैब पूरा करना ;-)

  1. बस पहले अक्षर को टाइप करें cd Mi(या यदि आवश्यक हो तो अधिक अक्षर) और दबाएं Tab। बाकी शब्दों को पूरा करके टर्मिनल आपकी मदद करेगा।

दूसरा तरीका: ड्रैग एंड ड्रॉप

  1. यदि आप निर्देशिका देख सकते हैं और यदि आप टर्मिनल का उपयोग करके इसे एक्सेस करना चाहते हैं, तो बस टाइप करें: cdपहले और फिर टर्मिनल पर निर्देशिका को खींचें और छोड़ें और हिट करें enter

24

इसे इस प्रकार लिखें:

cd 'Milano, Torino (Jan)-Compressed'

अन्यथा यह Milano,फ़ोल्डर नाम के रूप में व्यवहार करता है । यह फ़ोल्डर के नाम पर रिक्त स्थान के कारण होता है। वैकल्पिक रूप से कुछ विशेष पात्रों से बचिए:

cd Milano\,\ Torino\ \(Jan\)-Compressed/

22

tl; dr : किसी विशेष वर्ण को उद्धृत करने के लिए या तो इसे बैकस्लैश के साथ छोड़ें \या इसे दोहरे " "या एकल उद्धरणों में संलग्न करें ' 'Tab ↹पूर्णता उचित उद्धरण का ध्यान रखती है।


आप जो पूछ रहे हैं उसे कोटिंग कहा जाता है :

कोटिंग का उपयोग शेल के कुछ वर्णों या शब्दों के विशेष अर्थ को निकालने के लिए किया जाता है। (…) तीन उद्धरण तंत्र हैं: बच चरित्र , एकल उद्धरण , और दोहरे उद्धरण[प्रशंसा पत्र से लिया man bash]

भागने के चरित्र के साथ उद्धरण \

एक गैर-उद्धृत बैकस्लैश ( \) भागने का पात्र है। यह अपवाद के अपवाद के साथ अगले चरित्र के शाब्दिक मूल्य को संरक्षित करता है <newline>

तो एक निर्देशिका या एक विशेष चरित्र के साथ एक फ़ाइल दर्ज करने के लिए \, उदाहरण के लिए, बाद वाले से बच जाएं :

cd space\ dir      # change into directory called “space dir”
cat space\ file    # print the content of file “space file”
echo content > \\  # print “content” into file “\”
cat \(             # print the content of file “(”
ls -l \?           # list file “?”

bashके प्रोग्राम समापन (उर्फ Tab ↹समापन) स्वचालित रूप से एस्केप वर्ण के साथ विशिष्ट वर्णों निकल जाता है \

दोहरे उद्धरण के साथ उद्धरण " "

दोहरे उद्धरण चिह्नों में पात्रों संलग्न उद्धरण के भीतर सभी पात्रों का शाब्दिक मूल्य को बरकरार रखता है, के अपवाद के साथ $, `, \, और, जब इतिहास विस्तार सक्षम किया गया है, !

तो एक निर्देशिका या एक विशेष चरित्र के साथ एक फ़ाइल दर्ज करने के लिए, कम से कम उत्तरार्द्ध या अपने फ़ाइल नाम या पथ का एक बड़ा हिस्सा दो उद्धरणों के साथ छोड़ दें, जैसे:

cd space" "dir     # change into directory called “space dir”
cd spac"e di"r     # equally
cd "space dir"     # equally
cat "space file"   # print the content of file “space file”
cat "("            # print the content of file “(”
ls -l "?"          # list file “?”

के रूप में $, `और !दोहरे उद्धरण चिह्नों, पैरामीटर विस्तार , कमांड प्रतिस्थापन , अंकगणित विस्तार और इतिहास विस्तार के अंदर उनके विशेष अर्थ को दोहरे-उद्धरण वाले तारों पर किया जाता है।

एकल उद्धरण के साथ उद्धरण ' '

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

तो एक निर्देशिका या एक विशेष चरित्र के साथ एक फ़ाइल दर्ज करने के लिए, कम से कम उत्तरार्द्ध या अपने फ़ाइल नाम या पथ का एक बड़ा हिस्सा दो उद्धरणों के साथ छोड़ दें, जैसे:

cd space' 'dir     # change into directory called “space dir”
cd spac'e di'r     # equal
cd 'space dir'     # equal
cat 'space file'   # print the content of file “space file”
cat '('            # print the content of file “(”
ls -l '?'          # list file “?”
echo content > '\' # print “content” into file “\”

आप में हवाला देते हुए के बारे में अधिक जानकारी प्राप्त कर सकते हैं man bash/ के हवाले से पर, wiki.bash-hackers.org और पर tldp.org


10

सी-जैसे तार और $ 'स्ट्रिंग'

अन्य बातों के अलावा, एक का उपयोग कर सकते हैं $'...'एएनएसआई-सी बैकस्लैश वर्णों का उपयोग जैसे बनाने के लिए के हवाले के प्रकार \nऔर \tउन आप उल्लेख किया है भी शामिल है। बाश 4.3 मैनुअल से:

$ 'स्ट्रिंग' रूप के शब्द विशेष रूप से व्यवहार किए जाते हैं। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है।

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

उदाहरण के लिए, ऐसी फाइलें बनाना और सूचीबद्ध करना:

$ touch a$'*'b  c$'\n'd                                                     
$ ls  a$'*'b  c$'\n'd                                                       
a*b  c?d

आप वर्ण हेक्स मानों का उपयोग कर सकते हैं, जैसे:

$ touch 'file(name'
$ ls file$'\x28'name
file(name

printf

पहले के समान विचार - बच पात्रों का लाभ उठाएं:

$ ls "$(printf "file\x28name")"                                             
file(name
$ echo "Hello World"  >  c$'\n'd                                            
$ cat "$(printf "c\nd")"                                                    
Hello World

इनोड का प्रयोग करें:

हर फ़ाइल या निर्देशिका में विशेष डेटा संरचना होती है, जिसे इनोड कहा जाता है, जो एक विशेष दशमलव संख्या द्वारा संदर्भित होती हैं। तो आप इसका उपयोग कर सकते हैं कि अप्रत्यक्ष रूप से findकमांड के माध्यम से फ़ाइल को विशेष रूप से इनकोड के साथ खोजें , और इसके साथ कुछ करें:

$ echo "This is a test" > file$'('name1
$ ls -i
5898996 file(name1  5898997 file?name2
$ find -type f -inum "5898996" -exec cat {} \;
This is a test

जब आप ग्लोब का उपयोग कर सकते हैं तो व्यक्तिगत फ़ाइलों से निपटने से बचें

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

$ for f in ./*; do echo "$f" ; done
file    name2
file(name1

के उपयोग पर ध्यान दें ./- फाइलनामों के खिलाफ सुरक्षा जो उनमें अग्रणी हो सकती है -


6

किसी फ़ोल्डर को खोलने के लिए किसी स्थान को घेरना, जैसे कोट्स cd "Some Directory"में जगह छोड़ना या बैकस्लैश के साथ उस स्थान से बचना, जैसे cd /home/kudic/Radna\ površina:।


3
या एक बैकस्लैश के साथ अंतरिक्ष से बच जाएं, जैसे:cd /home/kudic/Radna\ površina
टिमो

महान बिंदु! मैं उसका उल्लेख करना भूल गया। मैं आमतौर पर आदत से बाहर उद्धरण का उपयोग करता हूं, लेकिन लंबे समय में बैकस्लैश वास्तव में उपयोग करना बेहतर होता है।
कोरी व्हिटेकर

1
या एकल कोट्स ( 'Radna površina') का उपयोग करें , यदि आप नहीं चाहते हैं कि पर्यावरण चर ( $VARNAME) का विस्तार किया जाए और कमांड को बैकटिक्स में संलग्न किया $()जाए या चलाया जाए (या यदि फ़ाइलनाम में दोहरे उद्धरण हैं)।
एलियाह कगन

3

यदि यह निर्देशिका आपके होम फ़ोल्डर में है तो टाइप करें:

cd "Milano, Torino (Jan)-Compressed"

और पूर्ण मार्ग दें:

cd "/…/…/Milano, Torino (Jan)-Compressed"

यदि फ़ाइल नाम में कोई दोहरा उद्धरण है तो उस के साथ बच जाएँ \"


यदि आप एक अग्रणी फॉरवर्ड स्लैश के साथ एक पथ शुरू करते हैं, तो यह रूट से जाता है। आप इसे हटाना चाह सकते हैं।
isaaclw

@isaaclw यही कारण है कि उन्होंने इसे एक पूर्ण पथ के रूप में दायर किया: P

1
आह, यह तीन डॉट्स है, जो "चर" फ़ोल्डर को दर्शाता है। मैंने मान लिया कि यह दो बिंदु हैं, "मूल फ़ोल्डर" को दर्शाता है। क्षमा याचना।
isaaclw

3

एक अन्य विकल्प हालांकि इस मामले में सबसे अच्छा नहीं वाइल्डकार्ड का उपयोग करना है। तुम कोशिश कर सकते हो:

cd *Torino*

इस विधि का उपयोग करना सबसे अच्छा है जब किसी अन्य द्वारा साझा नहीं की गई निर्देशिका के नाम पर एक अलग शब्द या वाक्यांश होता है। उदाहरण के लिए मेरे पास माउंट पॉइंट / मीडिया / डेटाएसएसडी और / मीडिया / डेटाएचडीडी है। स्वतः पूर्णता तब तक काम नहीं करती है जब तक कि मैं नाम का लगभग आधा हिस्सा अपने HDD विभाजन को प्राप्त करने के लिए टाइप नहीं करता हूं

cd /media/*HD*

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