सूची से एक्सटेंशन वाली सभी फ़ाइलों को खोजने के लिए कमांड खोजने के लिए कैसे उपयोग करें?


179

मुझे डायरेक्टरी (gif, png, jpg, jpeg) से सभी छवि फ़ाइलों को खोजने की आवश्यकता है।

find /path/to/ -name "*.jpg" > log

न केवल .jpg फ़ाइलों को खोजने के लिए इस स्ट्रिंग को कैसे संशोधित करें?

जवाबों:


191
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

6
मेरे लिए मैक पर काम नहीं करता है, लेकिन -E (विस्तारित) विकल्प (शायद पाइप एक विस्तारित विशेषता है) के साथ काम करता है: खोज -E / पथ / -iregex "। * \ _ (jpg | gif | png | jpeg) "> लॉग
लोंग

138
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

काम करेगा। एक और अधिक सुंदर तरीका हो सकता है।


16
-नाम का मामला असंवेदनशील होगा
क्रिस कोस्टन

1
@ गेराल्ड: यह संभव है कि आपको बची हुई कोष्ठक में अपनी या अभिव्यक्ति को समूहित करने की आवश्यकता है: find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;अन्यथा निष्पादन केवल अंतिम भाग ( -iname '*.jpg' इस मामले में) पर लागू होता है ।
अगली सूचना तक रोक दिया गया।

यह एक महत्वपूर्ण टिप्पणी है। find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0केवल jpg फ़ाइलों को प्रिंट करेगा! आपको यहां कोष्ठक की आवश्यकता है:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
ऐनी वैन रोसुम

28

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

-Eकोष्ठक और अपने regex में पाइप से बचने के लिए होने से बचाता है।


2
मेरे खोज में यह नहीं है -E
wieczorek1990

1
हम्म -Eविकल्प find"विस्तारित नियमित अभिव्यक्तियों" का उपयोग करने के लिए कहता है। कई अन्य उपकरणों में एक समान विकल्प है, लेकिन मुझे यकीन नहीं है कि यह विकल्प सभी यूनिक्स वितरण पर उपलब्ध है।
tboyce12

8
मैक ओएस पर भी काम करता है।
c.gutierrez

2
@ tboyce12 ubuntu पर काम करना, मैं -gegextype को regex अभिव्यक्ति को सरल बनाने के लिए निर्दिष्ट कर सकता हूं find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)":।
डबलूजैक

1
हो सकता है कि @cjm find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log-iregexझंडे का उपयोग करना findअसंवेदनशील तरीके से मैच के मामले को बताता है।
tboyce12

11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

fileफ़ाइल नाम (या एक्सटेंशन) की परवाह किए बिना, फ़ाइल के प्रकार को पहचानने की कोशिश करने के लिए यह कमांड का उपयोग करता है ।

यदि /path/toया फ़ाइल नाम में स्ट्रिंग है image, तो उपरोक्त फर्जी हिट दे सकता है। उस मामले में, मैं सुझाव दूंगा

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

क्षमा करें, एक गलत क्लिक था और मैं स्पष्ट रूप से नीचे नहीं जा सकता ... :(
मार्क सिम्पसन

6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

2
क्या आप बता सकते हैं कि आपने नाम (iname पैरामीटर) के चारों ओर (बच गए) कोष्ठक क्यों जोड़े?
बजे बार्ट क्लिजिंजेल

असंगति का कोई कारण? -iname *.jpg, -o -name *.jpeg, -o -iname *gifसब एक अलग प्रारूप है।
गाड़ी

यदि आप कम से कम अन्य उत्तरों के साथ अंतर स्पष्ट कर सकते हैं।
एल-टेदी

6

ऊपर दिए गए @Dennis विलियमसन की प्रतिक्रिया के पूरक में, यदि आप चाहते हैं कि वही रेगेक्स फ़ाइल एक्सटेंशन के मामले में असंवेदनशील हो, तो -iregex:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

5

मैक ओएस उपयोग पर

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"


-1

अगर फाइल में कोई एक्सटेंशन नहीं है तो हम फाइल माइम प्रकार की तलाश कर सकते हैं

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

जहाँ (ऑडियो | वीडियो | मैट्रोस्का | एमपीईजी) माइम प्रकार regex हैं

और यदि आप उन्हें हटाना चाहते हैं:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

या बाकी सब को हटा दें लेकिन उन एक्सटेंशनों को:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

सूचना! ~ के बजाय ~

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