Ls [13] और ls {1,3} में क्या अंतर है?


11

मैंने कमांड का उपयोग करके अपनी निर्देशिका में तीन फाइलें बनाईं touch inv{1..3}.txt। अब मैंने दो कमांड का उपयोग किया और उनका आउटपुट बहुत अधिक है। उन दो आदेशों हैं ls inv[13].txtऔर ls {1,3}.txt

तो ये दोनों अलग कैसे हैं? ब्रेसिज़ की तुलना में चौकोर कोष्ठक कैसे भिन्न होते हैं? इसके अलावा मैं "linux [..]" के लिए जा रहा था, लेकिन कुछ भी नहीं मिला, तो क्या मुझे पता चल सकता है कि इन चीजों को linux शब्दावली में क्या कहा जाता है?

धन्यवाद


2
इसका नाम "फ़ाइल नाम विस्तार" या "ग्लोबिंग" है।
बाइट कमांडर

इनमें से कौन सा फ़ाइल नाम विस्तार या ग्लोबिंग है? क्या यह चौकोर कोष्ठक ([..]) या पुष्प कोष्ठक ({..}) है?
1

जवाबों:


14
  • {}ब्रेस विस्तार कहा जाता है। इसके दो रूप हैं: {x..y}और {x,y}, बदलें xऔर yकिसी भी वर्णमाला या संख्यात्मक मान के साथ।

    पहले रूप में , समावेशी {x..y}से xलेकर सभी मूल्यों तक विस्तारित किया जाएगा y। उदाहरण के लिए, {2..5}करने के लिए विस्तार किया जाएगा 2, 3, 4, 5

    दूसरी स्पष्ट रूप में, {x,y}केवल करने के लिए विस्तार किया जाएगा x, y। उदाहरण के लिए, {2,5}का विस्तार किया जाएगा 2और 5

    यदि कोई विस्तार संभव नहीं है, तो पैटर्न का शाब्दिक रूप से उदाहरण के लिए इलाज किया जाता है {a..3}

    ध्यान देने वाली महत्वपूर्ण बात यह है कि ब्रेस विस्तार किसी भी फ़ाइल मैच के बावजूद (यदि संभव हो) किया जाएगा, जबकि फ़ाइल निर्माण / मिलान में।

  • []एक pathname विस्तार (या ग्लोबिंग) पैटर्न के रूप में जाना जाता है। ब्रेस विस्तार के विपरीत, आप इसका उपयोग केवल फ़ाइल नाम के मिलान के दौरान कर सकते हैं, यदि आप फ़ाइलों का निर्माण करते समय इसका उपयोग करते हैं, तो इसका शाब्दिक उपचार किया जाएगा।

    इसके दो रूप हैं: [xyz...]और [x-y]

    पहले रूप में, यह चौकोर कोष्ठकों के अंदर किसी एक वर्ण से अलग से मेल खाएगा अर्थात् प्रत्येक वर्ण का अलग-अलग व्यवहार किया जाता है। तो इसके लिए [25].txtएक फाइल जिसका नाम 2.txtया 5.txtकरंट डाइरेक्टरी है, [245].txtसे मेल खाएगा , जबकि इसके लिए किसी भी फाइल का नाम 2.txtया 4.txtउससे मेल खाएगा 5.txt

    दूसरे रूप में, एक सीमा विस्तार व्यक्तिगत रूप से मेल खाने से पहले किया जाता है, यदि संभव हो तो अन्यथा शाब्दिक रूप से इलाज किया जाता है। तो के लिए [2-5]. txt, यह नामित किसी भी फ़ाइल से मेल खाएगा 2.txtया 3.txtया 4.txtया 5.txt। यदि सीमा का विस्तार नहीं किया जा सकता है, तो इसका इलाज शाब्दिक रूप से किया जाएगा [a-3].txt


इन दोनों के बीच एक महत्वपूर्ण व्यवहारिक अंतर तब होता है जब मैच करने के लिए अधिक पैटर्न होते हैं जबकि वास्तव में कम मिलान होता है। जैसा कि ब्रेस विस्तार किया जाता है, इससे कोई फर्क नहीं पड़ता, यह त्रुटि दिखाएगा कि कुछ फ़ाइल (s) मौजूद नहीं हैं, जबकि pathname का विस्तार बाकी के लिए किसी भी त्रुटि के बिना जो भी संभव होगा, मिलान करेगा:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

पोर्टेबिलिटी नोट:

[]पथ विस्तार ऑपरेटर POSIX इसलिए बॉर्न शैल और डेरिवेटिव के बीच पोर्टेबल द्वारा परिभाषित किया गया है।

ब्रेस विस्तार, {}POSIX द्वारा परिभाषित नहीं है, इसलिए सभी गोले के बीच पोर्टेबल नहीं है। उदाहरण के लिए, dash( shउबंटू में) यह नहीं है। यह से उधार लिया गया था cshऔर केवल जैसे कुछ गोले पर काम करेंगे bash, zsh, ksh93, fish। सुनिश्चित करें कि आप जिस शेल का उपयोग कर रहे हैं, उसे लागू करने से पहले समर्थन करता है।


उदाहरण:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

1
[ ]जब कोई मिलान नहीं होता है तो विस्तार के व्यवहार पर भरोसा करने से बचना चाहिए क्योंकि यह शेल कॉन्फ़िगरेशन के आधार पर भिन्न हो सकता है। आप उपयोग करना चाहते हैं [या ]एक फ़ाइल नाम में, यह आपके आदेश में उद्धृत किया जाना चाहिए। यह भी {13..79}और के बीच अंतर को ध्यान देने योग्य है [13-79]। पहले से रेंज में सभी नंबरों का उत्पादन करेगा 13करने के लिए 79, दूसरे वर्ण से मेल खाएगी 1, 3, 4, 5, 6, 7, और 9
कैस्पर डीप

@kasperd हां, यही nullglob(या इसी तरह) है। [13-79]मिलान के बारे में , मुझे लगता है कि मैंने अपने उत्तर में [] `के प्रति चरित्र व्यवहार के बारे में स्पष्ट रूप से उल्लेख किया है।
हेमायल

@heemayl मुझे लगता है कि यह भी ध्यान देने योग्य होगा कि `{1..3}` फॉर्म बशीवाद है। यह काम नहीं करेगा। मुझे लगता kshहै कि यह सुविधा है, लेकिन यह अधिक आधुनिक स्वाद नहीं है, जैसे कि mksh और pkdsh
Sergiy Kolodyazhnyy

@ शेर ने पोर्टेबिलिटी नोट जोड़ा।
heemayl

7

दो रूपों के बीच का महत्वपूर्ण अंतर यहां दिया गया है:

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txtएक ग्लोब है और आपके फाइल सिस्टम पर मेल खाने वाली फाइलों की सूची का विस्तार करेगा। यह पथनाम विस्तार है

inv{1,5}.txtके लिए विस्तारित inv1.txtऔर inv5.txtक्या फ़ाइलें आपके फाइल सिस्टम पर वास्तव में कर रहे की परवाह किए बिना। यह कंस विस्तार है


अन्य महत्वपूर्ण अंतर यह है कि आप लिख सकते हैं ba{con,tman}और चौकोर कोष्ठक का उपयोग करने के बराबर नहीं है। IOW, ब्रेस विस्तार केवल एकल वर्णों के लिए नहीं है।
हॉब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.