खोजने में 2 -name शर्तों को कैसे संयोजित करें?


94

मैं उन फाइलों की खोज करना चाहूंगा जो 2 -nameस्थितियों से मेल नहीं खाती हों । मैं इसे ऐसा कर सकता हूं:

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

और इससे उचित परिणाम मिलेगा लेकिन क्या मैं इन 2 शर्तो के साथ या किसी तरह जुड़ सकता हूं?

जवाबों:


46

आप एक उपेक्षित का उपयोग करके -regexभी ऐसा कर सकते हैं : -

 find ./ ! -regex  '.*\(deb\|vmdk\)$'

6
ध्यान दें कि -regexकी तुलना में कम पोर्टेबल है -name
jw013

145

हाँ तुम कर सकते हो:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

POSIX कल्पना से स्पष्टीकरण :

! अभिव्यक्ति : एक प्राथमिक की उपेक्षा; अपरिपक्व नहीं ऑपरेटर।

( अभिव्यक्ति ): सच है अगर अभिव्यक्ति सच है।

अभिव्यक्ति -o अभिव्यक्ति : प्राइमरी का विकल्प; या ऑपरेटर। पहली अभिव्यक्ति के सत्य होने पर दूसरी अभिव्यक्ति का मूल्यांकन नहीं किया जाएगा।

ध्यान दें कि खोलना और \मूल्यांकन दोनों, खोल द्वारा मूल्यांकन को रोकने के लिए एक बैकस्लैश ( ) द्वारा उपसर्ग किए जाते हैं ।


2
यदि आप परिणामों -execपर या कोई अन्य कार्रवाई कर रहे हैं find, \( \)तो पूरे मानदंड को याद रखें , अन्यथा -execकेवल अंतिम- -orनिर्धारित मानदंड पर लागू होगा । उन सभी पर काम करने के लिए, उन पर ध्यान दें:find \( <criterion> -o <criterion> \) -exec <command>
विक्टर सर्जीनको

25

आप समाधान के करीब थे:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

आप किसी भी क्रम में निम्नलिखित तर्क ऑपरेटरों को जोड़ सकते हैं:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT

6

आप निम्न के रूप में नियमित अभिव्यक्ति का उपयोग कर सकते हैं:

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

बैकस्लैश पलायन चरित्र है; .किसी एकल वर्ण से मेल खाता है, और *पिछले चरित्र को शून्य या अधिक बार मेल करने का कार्य करता है, इसलिए .*इसका अर्थ शून्य या अधिक वर्णों से मेल खाता है।


1
स्पष्टीकरण जोड़ने से आपका उत्तर बेहतर होगा।
एनएन

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