सबसे पहले, आप जो करने की कोशिश कर रहे हैं, l| grep <filename>
वह खराब है। यह मत करो। यहाँ पर क्यों।
l
कमांड वास्तव में एक उपनाम है ls -CF
$ type -a l
l is aliased to `ls -CF'
उबंटू के डिफ़ॉल्ट रूप से bash
, ls
एक उपनाम है ls --color=auto
। जैसा कि स्टीलड्राइवर ने टिप्पणी में बताया है कि कलराइजेशन --color=auto
बंद करना है। आपके विशिष्ट मामले में, आपके पास alias ls="ls -alh --color"
और alias l="ls -CF"
, जो मूल रूप से समाप्त हो रहा है ls -alh --color -CF
। स्विच का यह विशेष संयोजन अभी भी एक पाइप पर रंगीन आउटपुट भेजता है। उदाहरण के लिए:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
ध्यान दें कि कैसे .
और ..
निर्देशिका में एक ही सीक्वेंस हैं।
इस सबका क्या मतलब है
इसका मतलब है कि l
फ़ाइल प्रकार के अनुसार फाइलों की रंगीन सूची को आउटपुट करेगा। समस्या यह है कि पलायन दृश्यों के उपयोग के साथ रंगीकरण होता है । यही 1:34m
चीजें हैं - वे विशिष्ट रंगों के लिए भागने का क्रम हैं।
मुख्य समस्या यह है कि पार्सिंग ls
अक्सर स्क्रिप्ट में गलत आउटपुट और आपदाओं की ओर ले जाता है, बस इसलिए ls
कि पहले और अन्य विशेष वर्णों की तरह बच दृश्यों की अनुमति देता है। अधिक जानकारी के लिए यह लेख देखें: http://mywiki.wooledge.org/ParsingLs
आपको क्या करना चाहिए:
find
कमांड का उपयोग करें :
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
आप शेल ग्लोब और आधुनिक परीक्षण [[
कमांड के साथ ऐसा कुछ कर सकते हैं :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
या हो सकता है कि अजगर का उपयोग करें, जिसमें bash
अकेले की तुलना में बेहतर फ़ाइल नाम हैंडलिंग क्षमता है
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
अगर वहाँ के उत्पादन की प्रक्रिया की जरूरत नहीं है ls
, सरल गोलाबारी के साथ ls
भी काम कर सकते हैं। (याद रखें, यह केवल फाइलों की सूची देखने के लिए है, आउटपुट टेक्स्ट से निपटने के लिए इसे किसी अन्य प्रोग्राम में पास करने के लिए नहीं)
bash-4.3$ ls *1*
1.txt