एकाधिक एक्सटेंशन खोजने के लिए खोज आदेश का उपयोग कैसे करें


124

मैं jpgउपयोग करके सभी चित्र प्राप्त कर सकता हूं :

find . -name "*.jpg"  

लेकिन मैं pngपरिणामों के साथ-साथ फ़ाइलों को कैसे जोड़ सकता हूं ?


जवाबों:


152

-oविभिन्न मापदंडों के बीच ध्वज का उपयोग करें ।

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) एक जादू की तरह काम करता है।

नोट वहाँ चाहिए ब्रैकेट और उसकी सामग्री के बीच एक रिक्ति है या यह काम नहीं करेगा।

स्पष्टीकरण:

  • type -f - केवल फाइलों के लिए खोजें (निर्देशिका नहीं)
  • \(- type -fसभी तर्कों पर लागू करने के लिए आवश्यक
  • -o - तार्किक या ऑपरेटर
  • -iname- जैसे -name, लेकिन मैच असंवेदनशील है

क्या आपको कोष्ठक की आवश्यकता है। कमान उनके बिना मेरे लिए काम करती है। क्या उन्हें कुछ गोले की जरूरत है?
माइक डी

2
@miked कमांड उनके बिना "काम" करेगा, हाँ, लेकिन आप उन निर्देशिकाओं पर हिट प्राप्त कर रहे हैं जो कि .png के साथ-साथ उन फ़ाइलों पर भी हिट होती हैं जो .jpg के साथ समाप्त होती हैं, जो वास्तव में ऐसा नहीं था।
Shadur

1
स्पष्टीकरण देने के लिए धन्यवाद! type -fविस्तार नहीं है और कोष्ठकों के बिना दोनों भाव पर लागू होते हैं, तो, find ./ -type f -iname \*.jpg -o -type f -iname \*.pngभी काम करता है ... हालांकि यह दो पात्रों है लंबे समय तक :-)
miked

2
यह ऑपरेटर पूर्वता की बात है। जैसे a * b + cअलग हैa * (b + c)
शादुर

2
@ झाडू अच्छा पकड़, संशोधित।
शादुर

85

आप के साथ मापदंड को जोड़ सकते हैं -oके रूप में Shadur ने सुझाव दिया । ध्यान दें कि -ojuxtaposition की तुलना में कम पूर्वता है, इसलिए आपको कोष्ठक की आवश्यकता हो सकती है।

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

लिनक्स पर, आप -regexएक्सटेंशन का उपयोग एक निडर तरीके से कर सकते हैं । डिफ़ॉल्ट regexp सिंटैक्स Emacs ( मूल regexps प्लस कुछ एक्सटेंशन जैसे कि \|प्रत्यावर्तन के लिए) है; विस्तारित रेगेक्स पर स्विच करने का विकल्प है ।

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

FreeBSD, NetBSD और OSX पर, आप विस्तारित रेगेक्स -regexके साथ संयुक्त का उपयोग कर सकते हैं -E

find -E . -regex '.*\.(jpg|png)'

यह हमेशा उपयोग करना बेहतर है -inameके बजाय -nameतो आप भी कब्जा होगा - image.JPGऔरimage.PnG
ccpizza

40

यह अधिक सही है:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'

10
आप यह क्यों कहते हैं कि यह "अधिक" सही है?
केविन

2
@ केविन मुझे लगता है क्योंकि -iregexमैच और jpgसाथ ही JPG Jpg jpGऐसा है। मुझे लगता $है कि जरूरत नहीं है।
ott--

यह MinGW पर ठीक काम करता है ।
पीटर मोर्टेनसेन

2
सबसे पहले, आपने पहले तर्क के रूप में खोज फ़ोल्डर को छोड़ दिया जो एक त्रुटि फेंक देगा। दूसरे, OSX पर कोष्ठक से बचने से काम नहीं चलेगा, और इसका उपयोग इसके बजाय किया जाना चाहिए: find -E . -iregex '.*\.(jpg|png|gif)'जैसा कि @ सोरिन के उत्तर में दिखाया गया है।
ccpizza

8

यह स्पष्ट करने के लिए, लिनक्स, यूनिक्स और मैकओएस स्वाद पर काम करने वाला एकमात्र विकल्प है:

find -E . -regex '.*\.(jpg|png)'

ऐसा इसलिए है क्योंकि ओएस एक्स संस्करण थोड़ा अलग है, लेकिन यह उन चीजों को लिखने के लिए महत्वपूर्ण है जो अधिकांश प्लेटफार्मों पर अच्छी तरह से चलते हैं।


2
-ई झंडा उबंटू 14.04 पर खोजने के लिए मान्य नहीं है
गोगामन

-E ध्वज मिनगेड पर या तो मान्य नहीं है (कम से कम संस्करण / विन्यास मैंने इस पर कोशिश की (किसी विशेष संस्करण के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन))।
पीटर मोर्टेनसेन

-type f \( -iname \*.png -o -iname \*.jpg\)OSX पर कौन सा भाग काम नहीं करता है?
शादुर

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