अजीब व्यवहार "ls -a | grep ^ \ "


10

मैं एक pwd की सामग्री को सूचीबद्ध करना चाहता था और केवल डॉट से शुरू होने वाली फ़ाइल प्रदर्शित करता था। मैंने कोशिश की ls -a | grep ^\.लेकिन मैं यह पता नहीं लगा सकता कि आउटपुट में वे फाइलें भी क्यों नहीं हैं जो डॉट से शुरू नहीं होती हैं। उदाहरण के लिए:

Pictures
.pip
.pki
.profile
projects
Public

मुझे पता है कि मैं जो कुछ भी चाहता हूं उसे हासिल कर सकता हूं क्योंकि ls -ld .*मुझे बस grep के इस व्यवहार के बारे में उत्सुकता है जो मैं समझा नहीं सकता।



सिर्फ ls -d .*शुरुआत करने वाली सभी फाइलों को सूचीबद्ध करने के लिए क्यों नहीं .?
बरमार

एक सावधान नोट: ls के आउटपुट को किसी अन्य कमांड में कभी भी पाइप न करें। बजाय खोजने का उपयोग करें। ls के पास बहुत अधिक विचारधाराओं पर भरोसा करने का तरीका है। देखें: mywiki.wooledge.org/BashPitfall पर पिटफुल 1 - इसने बनाया # 1! बाकी साइट बहुत अच्छी है।
जो

जवाबों:


20

grepइस प्रकार तर्क को उद्धृत करेंls -a | grep '^\.'

इसका कारण यह है कि शेल संभालता है \.और इसे वापस सादे में बदल देता है ., जो grepतब एकल-वर्ण वाइल्डकार्ड के रूप में व्यवहार करता है। यदि संदेह है, तो हमेशा एक स्ट्रिंग को उद्धृत करें जिसमें (या हो सकता है) एक चरित्र है जो शेल के लिए विशेष है।


शेल क्यों अनदेखा करता है \ _?
पीएस-ऑक्स

\ n एक एस्केप सीक्वेंस है जो शेल को निम्नलिखित अक्षर को शाब्दिक मानता है। इसमें grep ^\\., \\ को शेल द्वारा सिंगल बैकस्लैश के रूप में माना जाता है और फिर से grep सिंगल बैकस्लैश के बाद डॉट को शाब्दिक डॉट के रूप में मानता है।
अविनाश राज

11

आपको उद्धरणों के अंदर grep regex डालना होगा।

ls -a | grep '^\.'

नोट: कमांड के आउटपुट को पार्स न करेंls


Ls के आउटपुट को पार्स करना बुरा क्यों है?
पीएस-ऑक्स

लिंक से: अपने डिफ़ॉल्ट मोड में, यदि मानक आउटपुट टर्मिनल नहीं है, तो ls नए नामों के साथ फाइलनेम को अलग करता है। यह तब तक ठीक है जब तक कि आपके पास इसके नाम की नई लाइन वाली फाइल नहीं है।
माइकल डुरंट

@ मिचेल डुरंट: मेरा सुझाव है कि फ़ाइल नाम में नई सूचियों की अनुमति देना एक प्रमुख सिस्टम बग है।
jamesqf

@jamesqf - फ़ाइल नाम (विशेष रूप से sml के उत्तर) में नए समाचार देखें।
19

0

यदि आप cmd ls -a निष्पादित करते हैं grep ^ \ _। तब grep "\" को एक विशेष चरित्र और "का अर्थ" नहीं मानता है। बचो मत।

जब हम cmd ls -a का उपयोग करते हैं | grep "^ \" तब grep "\" को एक विशेष चरित्र और "का अर्थ" मानता है। भाग जाता है। यह आपको अपेक्षित परिणाम देगा।

यदि आप बिना उद्धरण के grep cmd का उपयोग करना चाहते हैं तो आपको "\" वर्ण से भी बचना चाहिए। आप निम्नलिखित आदेश द्वारा दोहरे उद्धरण चिह्नों के बिना परिणाम की उम्मीद कर सकते हैं। ls -a | grep ^ \\

Regex में विशेष वर्णों के अर्थ के बारे में विवरण के लिए, निम्नलिखित लिंक देखें। http://www.regular-expressions.info/quickstart.html

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