a*
और *a*
वाक्य रचना खोल द्वारा कार्यान्वित किया जाता, द्वारा नहीं ls
आदेश।
जब आप टाइप करें
ls a*
आपके शेल प्रॉम्प्ट पर, शेल a*
मौजूदा निर्देशिका में उन सभी फ़ाइलों की सूची में विस्तारित होता है, जिनके नाम से शुरू होता है a
। उदाहरण के लिए, यह a*
अनुक्रम तक विस्तारित हो सकता है a1 a2 a3
, और उन्हें तर्क के रूप में पारित कर सकता है ls
। ls
आदेश अपने आप कभी नहीं देखता *
चरित्र; यह केवल तीन तर्कों को देखता है a1
, a2
और a3
।
वाइल्डकार्ड विस्तार के प्रयोजनों के लिए, "फाइलें" वर्तमान निर्देशिका में सभी संस्थाओं को संदर्भित करती हैं। उदाहरण के लिए, a1
एक सामान्य फ़ाइल a2
हो सकती है, एक निर्देशिका हो सकती है, और a3
एक सिमलिंक हो सकती है। उन सभी में निर्देशिका प्रविष्टियाँ हैं, और शेल के वाइल्डकार्ड विस्तार से यह परवाह नहीं है कि वे प्रविष्टियाँ किस प्रकार की इकाई को संदर्भित करती हैं।
व्यावहारिक रूप से सभी गोले आपके (bash, sh, ksh, zsh, csh, tcsh, ...) वाइल्डकार्ड लागू करने की संभावना है। विवरण अलग-अलग हो सकते हैं, लेकिन *
शून्य या अधिक वर्णों के ?
मिलान और किसी एक वर्ण से मेल खाने का मूल सिंटैक्स यथोचित संगत है।
विशेष रूप से बैश के लिए, यह बैश मैनुअल के "फाइलनाम विस्तार" अनुभाग में प्रलेखित है; info bash
"फाइलनाम विस्तार" के लिए दौड़ें और खोजें, या यहाँ देखें ।
तथ्य यह है कि यह शेल द्वारा किया जाता है, और व्यक्तिगत आदेशों द्वारा नहीं, कुछ दिलचस्प (और कभी-कभी आश्चर्यजनक) परिणाम होते हैं। इसके बारे में सबसे अच्छी बात यह है कि वाइल्डकार्ड हैंडलिंग सभी कमांड के लिए (बहुत लगभग) संगत है ; यदि शेल ने ऐसा नहीं किया, तो अनिवार्य रूप से कुछ कमांड्स परेशान नहीं करेंगे, और अन्य इसे सूक्ष्म रूप से अलग तरीके से करेंगे जो लेखक ने सोचा था - "बेहतर"। (मुझे लगता है कि विंडोज कमांड शेल में यह समस्या है, लेकिन मैं इससे परिचित नहीं हूं ताकि आगे टिप्पणी कर सकूं।)
दूसरी ओर, कई फ़ाइलों का नाम बदलने के लिए एक कमांड लिखना मुश्किल है। यदि आप लिखते हैं:
mv *.log *.log.bak
यह संभवतः विफल हो जाएगा, क्योंकि *.log.bak
मौजूदा निर्देशिका में पहले से मौजूद फ़ाइलों के आधार पर विस्तार किया गया है। ऐसे आदेश हैं जो इस तरह का काम करते हैं, लेकिन उन्हें यह निर्दिष्ट करने के लिए अपने स्वयं के सिंटैक्स का उपयोग करना होगा कि फ़ाइलों का नाम कैसे बदला जाए। कुछ कमांड (जैसे find
) अपने स्वयं के वाइल्डकार्ड विस्तार कर सकते हैं; आपको शेल के विस्तार को दबाने के लिए तर्कों को उद्धृत करना होगा:
find . -name '*.txt' -print
शेल का वाइल्डकार्ड विस्तार पूरी तरह से कमांड-लाइन तर्क और मौजूदा फ़ाइलों के सेट के सिंटैक्स पर आधारित है। यह कमांड के अर्थ से प्रभावित नहीं हो सकता है। उदाहरण के लिए, यदि आप सभी .log
फ़ाइलों को मूल निर्देशिका में ले जाना चाहते हैं, तो आप टाइप कर सकते हैं:
mv *.log ..
यदि आप भूल जाते हैं ..
:
mv *.log
और .log
वर्तमान निर्देशिका में वास्तव में दो फाइलें होंगी, इसका विस्तार होगा:
mv one.log two.log
जिसका नाम बदलकर one.log
लौंग रखा जाएगा two.log
।
संपादित करें : और 52 अपवोट्स के बाद, एक स्वीकार, और एक गुरु बिल्ला, शायद मुझे वास्तव में शीर्षक में सवाल का जवाब देना चाहिए।
-d
या --directory
विकल्प के लिए ls
केवल निर्देशिका सूची यह नहीं बताता है। यह इसे निर्देशिका के रूप में खुद को सूचीबद्ध करने के लिए कहता है, न कि उनकी सामग्री पर। यदि आप एक निर्देशिका नाम को तर्क के रूप में देते हैं ls
, तो यह निर्देशिका की सामग्री को सूचीबद्ध करेगा , क्योंकि आमतौर पर आप जिस चीज में रुचि रखते हैं। -d
विकल्प इसे केवल निर्देशिका को सूचीबद्ध करने के लिए कहता है। वाइल्डकार्ड के साथ संयुक्त होने पर यह विशेष रूप से उपयोगी हो सकता है। यदि आप टाइप करते हैं:
ls -l a*
ls
आपको प्रत्येक फ़ाइल की एक लंबी सूची देगा, जिसका नाम शुरू होता है a
, और प्रत्येक निर्देशिका की सामग्री जिसका नाम शुरू होता है a
। यदि आप फ़ाइलों और निर्देशिकाओं की एक सूची चाहते हैं, तो प्रत्येक के लिए एक पंक्ति, आप उपयोग कर सकते हैं:
ls -ld a*
जो इसके बराबर है:
ls -l -d a*
फिर से याद रखें कि ls
कमांड कभी भी *
चरित्र को नहीं देखता है ।
जहां तक यह प्रलेखित है, man ls
आपको ls
किसी भी यूनिक्स जैसी प्रणाली के बारे में कमांड के लिए प्रलेखन दिखाएगा । अधिकांश लिनक्स-आधारित सिस्टम पर, ls
कमांड GNU कोरुटिल्स पैकेज का हिस्सा है; यदि आपके पास info
कमांड है, तो info ls
या तो info coreutils ls
आपको अधिक निश्चित और व्यापक दस्तावेज देना चाहिए। अन्य प्रणालियाँ, जैसे कि MacOS, ls
कमांड के विभिन्न संस्करणों का उपयोग कर सकती हैं , और कमांड नहीं हो सकती हैं info
; उन प्रणालियों के लिए, का उपयोग करें man ls
। और यदि आप GNU कोरुटिल्स कार्यान्वयन का उपयोग कर रहे हैं तो अपेक्षाकृत कम उपयोग संदेश (मेरे सिस्टम पर 117 लाइनें) ls --help
दिखाएगा ।
और हां, यहां तक कि विशेषज्ञों को अभी और फिर प्रलेखन से परामर्श करने की आवश्यकता है। इस क्लासिक मजाक को भी देखें ।