2010-03-23 12 views
10

में वाइल्डकार्ड खोज से एक स्ट्रिंग को बाहर निकालें, मैं एक फ़ाइल खोज से एक निश्चित स्ट्रिंग को बाहर करने की कोशिश कर रहा हूं।एक शेल

मान लीजिए कि मेरे पास फाइलों की एक सूची है: file_Michael.txt, file_Thomas.txt, file_Anne.txt।

मैं

ls *<and not Thomas>.txt 

की तरह कुछ लिखने के लिए मुझे file_Michael.txt और file_Anne.txt, लेकिन नहीं file_Thomas.txt देने में सक्षम हो और करना चाहते हैं।

रिवर्स आसान है:

ls *Thomas.txt 

एक भी चरित्र के साथ यह कर भी आसान है:

ls *[^s].txt 

लेकिन यह कैसे एक स्ट्रिंग के साथ यह करने के लिए?

सेबस्टियन

+1

संभव डुप्लिकेट [मैं कैसे उलटा उपयोग कर सकते हैं या नकारात्मक वाइल्डकार्ड जब एक यूनिक्स/लिनक्स खोल में पैटर्न मिलान?] (Http://stackoverflow.com/questions/216995/how-can-i-use- उलटा-या-नकारात्मक-वाइल्डकार्ड-जब-पैटर्न-मिलान-इन-ए-यूनिक्स-लिनु) – Hasturkun

उत्तर

12

बैश के साथ

shopt -s extglob 
ls !(*Thomas).txt 

कुछ अन्य तरीकों से

find . -type f \(-iname "*.txt" -a -not -iname "*thomas*" \) 

ls *txt |grep -vi "thomas" 
+1

उत्तर के लिए धन्यवाद। पहली पंक्ति का क्या अर्थ है? – steigers

+3

पहली पंक्ति का मतलब विस्तारित ग्लोबिंग सेट है। http://www.gnu.org/software/bash/manual/bashref.html#Pattern- अधिक – ghostdog74

16

ऐसा करने के लिए लगता है का उपयोग कर सकते हैं:

$ find . -name '*.txt' -a ! -name '*Thomas.txt' 
+0

के लिए देखकर धन्यवाद, यही मुझे चाहिए। – steigers

+1

आपको सरल वाइल्डकार्ड के समान व्यवहार प्राप्त करने के लिए '-maxdepth 1' जोड़ने की आवश्यकता हो सकती है –

2

आप एक वाइल्डकार्ड पाशन रहे हैं, तो बस बाकी के बाकी को छोड़ दें अगर कुछ ऐसा है जिसे आप बाहर करना चाहते हैं तो eration।

for file in *.txt; do 
    case $file in *Thomas*) continue;; esac 
    : ... do stuff with "$file" 
done 
की
संबंधित मुद्दे