उन फ़ाइलों की सूची बनाएं जो एक पैटर्न से मेल खाती हैं लेकिन उन फ़ाइलों को अनदेखा करती हैं जो किसी अन्य पैटर्न से मेल खाती हैं?


12

मान लीजिए कि मेरे पास a1, a2, a3, b1, b2, b3 वाली फाइलें हैं। मैं केवल उन फ़ाइलों का मिलान करना चाहता हूं, जो शुरू होती हैं, aलेकिन उनमें शामिल नहीं हैं 3। मैंने कोशिश की, ls -I "*3" *a*लेकिन यह वापसी करता है a1 a2 a3, भले ही मैं इसे मैच नहीं करना चाहता a3। क्या यह संभव है ls?


यहाँ उत्तर के दिलचस्प विविध सेट, लेकिन ls -I '* 3' a * विफल की व्याख्या क्यों की जाएगी। और / या शेल के ग्लोबबेड की सूची को बाद में अनदेखा स्विच द्वारा ls में फ़िल्टर क्यों नहीं किया जा रहा है?
थियोफ्रेस्टस

आदमी पेज मैं विकल्प के बारे में कहते हैं: do not list implied entries matching shell PATTERN, लेकिन यह स्पष्ट नहीं होता क्या अर्थ होता है निहित , लेकिन मेरा अनुमान है कि यह केवल कि फ़ाइलों पर लागू होता lsग्लोब विस्तारों में हो जाता है - और lsविस्तार नहीं करता है a*, खोल करता है ।
मरे जेन्सन

जवाबों:


14

बस:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob सक्रिय ग्लोबिंग को बढ़ाया।
  • a शुरू से मेल खाता है a
  • !()मैच के अंदर ()...
    • *3*जो है 3और इसके पहले या बाद में कुछ भी।

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
FYI करें, की आवश्यकता हैset -s extglob
ब्रायन

@ ब्रायन ये, सिर्फ ^ ^
अराजकता

8

मौजूदा जवाब अच्छी तरह से ग्लोब के साथ ऐसा करने का सबसे अच्छा तरीका है; findयदि आप स्क्रिप्टिंग या आगे की प्रक्रिया करना चाहते हैं तो मैं इसे ज्यादातर मामलों में शामिल करूंगा, एक बेहतर विकल्प है

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

आप xargsआसान कार्यों के लिए, या while readअधिक जटिल चीजों के लिए एक पाश को जवाब खिला सकते हैं।


4

एक आसान तरीका है

  • मिलान करने वाली सभी फ़ाइलों को सूचीबद्ध करने के लिए a*
  • उसके बाद सभी लाइनों को हटा दें 3

UNIX कमांड है

ls -1 a* | grep -v 3

ls -1 प्रति पंक्ति एक फ़ाइल दिखाता है।

grepआम तौर पर ऐसी रेखाएँ पाई जाती हैं जो एक पैटर्न से मेल खाती हैं लेकिन -vइस व्यवहार के साथ उल्टा है, अर्थात grep उस रेखा को खोजता है जो उस पैटर्न से मेल नहीं खाती है।


2
हाय पीटर! यह समझाने के लिए सबसे अच्छा होगा, जितना प्रासंगिक है उतना ही विस्तार से, आपका समाधान कैसे काम करता है।
धग

2
पार्सिंग lsएक goob विचार नहीं है: mywiki.wooledge.org/ParsingLs
chaos

3

साथ zshका उपयोग कर, ~ ग्लोब ऑपरेटर :

setopt extendedglob
print -rl -- a*~*3*

साथ gnu lsआप दो इस्तेमाल कर सकते हैं --ignoreविकल्प:

ls -I '[^a]*' -I '*3*'

1 ऐसे सभी फ़ाइल नामों को aअनदेखा करता है, जिनके साथ प्रारंभ नहीं होता है और 2 अनदेखा फ़ाइल नाम होते हैं3

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