CMD: *। * या सिर्फ *?


47

1990 के दशक में, मैं *.*MS-DOS में किसी भी फ़ाइलनाम का प्रतिनिधित्व करने के लिए " " का उपयोग करूंगा , लेकिन मैंने *इन दिनों अधिक स्क्रिप्ट का उपयोग करके देखा है । क्या वास्तव में इससे कोई फर्क पड़ता है कि मैं किसका उपयोग करता हूं?


9
हालांकि यह सच है कि *और *.*अब cmdआंतरिक कमांड और आधुनिक कमांड-लाइन उपयोगिताओं के लिए समान हैं, फ़ाइल मास्क मापदंडों को लेने वाले कुछ पुराने उपयोग पुराने फ़ाइल मिलान कार्यों का उपयोग कर सकते हैं, और उनके लिए मास्क समकक्ष नहीं होंगे।
AFH

@AFH मुझे नहीं लगता कि टोकन बराबर हैं। *.*टोकन extensionless फ़ाइलों को लौटा नहीं करना चाहिए।
tuskiomi

1
@tuskiomi - मैं आपके साथ सहमत हूँ जो विस्तार रहित फ़ाइलों को वापस *.* नहीं करना चाहिए । दुर्भाग्य से यह करता है। देखें ग्रैविटी का जवाब
AFH

जवाबों:


65

फ़ाइल नाम और विस्तार एक एकल क्षेत्र रहा है जब से विंडोज 95 और NT 3.5 ने "लंबी फ़ाइल नाम" समर्थन पेश किया है, और वाइल्डकार्ड मैच एक ही बार में पूरे फ़ाइलनाम के खिलाफ किए जाते हैं। नतीजतन, आप इसमें कोई डॉट्स के साथ एक फ़ाइल नाम रख सकते हैं (शायद फ़ाइलों के लिए दुर्लभ, लेकिन फ़ोल्डर / निर्देशिका के लिए बहुत ही सामान्य) और पहली नज़र में *.*वास्तव में ऐसी फ़ाइलों से मेल नहीं खाएगा।

उपयोग करने वाली पुरानी स्क्रिप्ट अभी भी संगतता कोड के कारण काम *.* करेगी - यदि वाइल्डकार्ड के साथ समाप्त होता है .*, तो उस भाग को ओएस द्वारा अनदेखा किया जाता है। (इसलिए यदि आप विशेष रूप से एक्सटेंशन के साथ फ़ाइलों का मिलान करना चाहते हैं , तो मुझे लगता है कि आपको इसके लिए आवश्यकता होगी *.?*।)

लेकिन यह कुछ ऐसा नहीं है जिस पर आपको भरोसा करना चाहिए; यदि आप आधुनिक विंडोज संस्करणों के लिए स्क्रिप्ट लिख रहे हैं, उनके सम्मेलनों, का पालन नहीं MS-DOS सम्मेलनों। (ध्यान दें कि Windows NT के रूप में, .bat लिपियों की व्याख्या MS-DOS द्वारा नहीं की जाती है cmd.exe, लेकिन एक देशी Win32 प्रोग्राम द्वारा की जाती है।)


लिनक्स और विभिन्न अन्य यूनिक्स पर, नाम और विस्तार पहली जगह में कभी अलग नहीं हुए हैं, और काम करने के लिए कोई विशेष जादू नहीं है*.* , इसलिए *एकमात्र विकल्प है जो समझ में आता है।


14
"चलो एक्सटेंशन के साथ फ़ाइलों को फ़िल्टर करना कठिन है! याय!" -अनुनामक Microsoft डेवलपर
जॉन हैमिल्टन

50
"चलो सभी के लिए लाखों मौजूदा बैच स्क्रिप्ट को तोड़ दें! याय!" -नहीं माइक्रोसॉफ्ट डेवलपर, एवर
ग्रैविटी

3
ISTR कि DOS के कुछ पुराने संस्करणों पर, *केवल एक्सटेंशन के बिना फ़ाइल नाम से मेल खाएगा । दोनों के साथ संगत होने का 'सुरक्षित' तरीका था **
रैंडम 832

8
ओपी विंडोज के बारे में है, लेकिन चूंकि आपने लिनक्स का उल्लेख किया है: कुछ गोले (उदाहरण के लिए, बैश) में, *( डिफ़ॉल्ट रूप से ) छिपे हुए फ़ाइल नाम (एक के साथ शुरू) से मेल नहीं खाता है .
फ्लोरियन ब्रूकर

4
"ओएस स्तर" के कुछ मूल्यों के लिए ... यह विंडोज में वास्तव में एक शेल (एक्सप्लोरर) अवधारणा है, भी - कर्नेल को .exe के बारे में परवाह नहीं है, न ही कुछ और। चाहे विंडोज एक्सप्लोरर अधिक "ओएस स्तर" है जैसे कि लिनक्स में नॉटिलस का तर्क दिया जा सकता है।
विशालकाय

11

यह शायद उल्लेख के लायक है कि Unixy / बॉर्न शैल, बैश, ksh, zsh, आदि जैसे posixy गोले वाइल्डकार्ड विस्तार करना (के ग्लोब पात्रों की तरह है *, ?, [range], [!range]और ब्रेसिज़ और विस्तारित globs जैसे अन्य विस्तार) तर्कों की सूची संकलित करने के लिए इससे पहले कि आदेश निष्पादित किया जाता है। इसलिए यह विस्तार शेल द्वारा किया जाता है न कि उस कमांड के लिए जिसके लिए ये तर्क हो सकते हैं।

यानी शेल किस चीज के लिए जिम्मेदार है *, इसका *.*विस्तार होता है

 $ ls
 file.csv  file.doc  file.pdf  file.txt  file.xlsx  zz-file-without-extension

 $ (set -xv; foo *)   # is actually expanded to the following
   + foo file.csv file.doc file.pdf file.txt file.xlsx zz-file-without-extension

 $ (set -xv; foo *.*)  # note this does not match `zz-file-without-extension`
   + foo file.csv file.doc file.pdf file.txt file.xlsx

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

मेरा मानना ​​है कि इस तरह संक्षेप में सुरक्षित है।

  • सीएमडी के तहत यह उपयोगिता पर निर्भर करता है।
  • PowerShell के तहत, WildCardPattern क्लास का उपयोग करने वाली उपयोगिताओं, सकारात्मक व्यवहारों का एक सुसंगत उपसमुच्चय प्रदान करेगा।

एक और अंतर यह है कि सीएमडी के तहत, अधिकांश प्रोग्राम वास्तव में कच्चे वाइल्डकार्ड को कर्नेल (फाइंडफ्रस्टाइल) के लिए आगे बढ़ाते हैं, जबकि लिनक्स पर ग्लोब सिर्फ पूरी सूची को पकड़ता है और यूजरस्पेस में फ़िल्टरिंग करता है।
ग्रेविटी

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

3
@ शुद्धता अधिक सटीक होने के लिए, विंडोज पर फाइल सिस्टम ड्राइवर द्वारा फ़िल्टरिंग की जाती है। यह नेटवर्क फ़ाइल सिस्टम पर विशेष रूप से उपयोगी है (विशेषकर वापस जब आप एक दूरस्थ फ़ाइल सिस्टम के लिए 8 केबी लाइन चला सकते हैं), लेकिन इसका मतलब यह भी है कि आप मनमाने ढंग से खोज के साथ-साथ स्पष्ट रूप से समर्थित खोजों को नहीं कर सकते। रेमंड चेन के ब्लॉग पर इसके निहितार्थों का कई बार पता लगाया गया है। FindFirstFileस्वयं उपयोगकर्ता-मोड है (दोनों कर्नेल 32.dll और ntdll.dll उपयोगकर्ता-मोड लाइब्रेरी हैं - यह Win32 सबसिस्टम का हिस्सा है, कर्नेल नहीं), लेकिन यह वास्तव में बहुत कुछ नहीं करता है।
लुआं

आह, मैं इस धारणा के तहत था कि FindFirstFile बहुत सीधे एक समान syscall (लिबास में कैसे खुला (3) लिपटे बस लिनक्स कर्नेल में खुला) (2) लपेटा।
ग्रैविटी

1
@cup: शेल को ग्लब्स के विस्तार से रोकने के लिए बस उद्धरणों का उपयोग करें, ताकि आप उन्हें कमांड में पास कर सकें। उदा mmv "fred.*" "tom.#1"। (प्रतिस्थापन का उपयोग करता #1है *, जिसके बजाय आपको पुन: ऑर्डर फ़ील्ड देने का लाभ होता है)। mmvअधिकांश सिस्टम पर डिफ़ॉल्ट रूप से स्थापित नहीं किया गया है, लेकिन अन्य बैच-नाम उपकरण अक्सर होते हैं। इसके बारे में इस लेख को देखें , और stackoverflow.com/questions/417916/how-to-do-a-mass-rename
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.