सबसे पहले, आप जो करने की कोशिश कर रहे हैं, 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