खोजने में 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.