किसी विशिष्ट एक्सटेंशन के साथ पुन: फ़ाइलें ढूंढें


81

मैं विशिष्ट एक्सटेंशन वाली फाइलें ढूंढने की कोशिश कर रहा हूं। उदाहरण के लिए, मैं सभी .pdf और .jpg फाइलें ढूंढना चाहता हूं जिनका नाम रॉबर्ट है

मुझे पता है कि मैं यह कमांड कर सकता हूं

$ find . -name '*.h' -o -name '*.cpp'

लेकिन मुझे एक्सटेंशन के अलावा फाइल का नाम भी बताना होगा। मैं सिर्फ यह देखना चाहता हूं कि क्या फ़ाइल नाम को दोबारा लिखने से बचने का एक संभव तरीका है और फिर से धन्यवाद!


4
कोई भी इस आदेश की नकल कर रहा है, या किसी भी नीचे, inameइसके बजाय का उपयोग करना चाहिए - जो असंवेदनशील है
एडीसन

अच्छा बिंदु, एडिसन (इसलिए +1)। हालाँकि, ऐसा लगता है कि ओपी एक 'आर' के साथ 'रॉबर्ट' नाम की फाइलें चाहता है। जैसा कि मैंने पोस्ट की व्याख्या की है, इसका मतलब है कि 'रॉबर्ट' वाली फाइलें आउटपुट नहीं होनी चाहिए। ' आर obert` क्या लिखा है। हालाँकि, ऐसी स्थितियाँ हैं जब कोई चाहेगा कि 'रॉबर्ट' या 'रॉबर्ट' को खोजा जाए। शायद ओपी इस स्थिति में है। उपयोग करना है inameया nameआप क्या खोजना चाहते हैं, इस पर निर्भर करता है। मैं उन स्थितियों में रहा हूँ जहाँ मामला आवश्यक था।
bldldave025

जवाबों:


101

मेरी प्राथिमिकता:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

2
अच्छी तरह से काम करता है, लेकिन मामूली नुकसान यह है कि यह आपको ऐसा करने से रोकता हैfind -exec ...
मार्क सेटेल

क्या होगा यदि मैं सभी फ़ोल्डर में एक विशिष्ट पथ में सभी xxx- परिनियोजन.आईएमएल फाइलें ढूंढता हूं?
नईम सलामेह

अगर आपके पास jpgया pngलंबे रास्ते का हिस्सा है तो यह इतना अच्छा काम नहीं करता है ।
ऑटोनॉमस

18

का उपयोग करते हुए findकी -regexतर्क:

find . -regex '.*/Robert\.\(h\|cpp\)$'

या बस का उपयोग कर -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)

4
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

-oएक repreents ORहालत और आप ब्रेसिज़ के भीतर इच्छा के रूप में आप कई के रूप में जोड़ सकते हैं। तो यह उनके नाम में कहीं भी "रॉबर्ट" शब्द वाली सभी फाइलों को खोजने के लिए कहता है और जिनके नाम "पीडीएफ" या "jpg" दोनों में समाप्त होते हैं।


3

विकल्प का उपयोग -regexकरने के विकल्प के रूप में find, चूंकि प्रश्न लेबल है, आप ब्रेस विस्तार तंत्र का उपयोग कर सकते हैं:

eval find . -false "-o -name Robert".{jpg,pdf}

रिपोर्ट पाएं "रास्तों को अभिव्यक्ति से पहले होना चाहिए", समस्या क्या है? मैं आमतौर पर इसे हल करने के लिए उद्धरण जोड़ता हूं, लेकिन इस अभिव्यक्ति के लिए काम नहीं करता। धन्यवाद!
netawater

मुझे संदेह है कि या तो आप भूल गए evalया .ऊपर दिए गए कमांड में, या आपका findकुछ और जटिल के लिए एक उपनाम है, या आप findलिनक्स के अपने संस्करण पर जीएनयू स्टॉक का उपयोग नहीं कर रहे हैं ।
jxh

आपके उत्तर के लिए धन्यवाद, मैंने इस तरह से एक स्क्रिप्ट का उपयोग किया: FILEEXTEIONS = cs, [ch] eval find। -false "-o -name *"। {$ FILEEXTEIONS}, और यह उस त्रुटि की रिपोर्ट करता है।
netawater

जहाँ तक मुझे पता है, ब्रेस विस्तार ब्रेस के अंदर परिवर्तनशील विस्तार नहीं होगा।
jxh

1
मैं इस तकनीक को एक एंड्रॉइड शेल में उपयोग करना चाहता था लेकिन इसके find समर्थन नहीं करता है -false। मैंने इसके चारों ओर दो परस्पर-विशिष्ट स्थितियाँ देकर काम किया ताकि वे सामूहिक रूप से झूठे हों -inum 1 -inum 2:।
18'18


1

एक स्क्रिप्ट के रूप में आप उपयोग कर सकते हैं:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print
  • इसे के रूप में सहेजें findcc
  • chmod 755 खोजे

और इसका उपयोग करें

findcc [name] [[search_direcory]]

जैसे

findcc                 # default name 'Robert' and directory .
findcc Joe             # default directory '.'
findcc Joe /somewhere  # no defaults

आप उपयोग नहीं कर सकते ध्यान दें

findcc /some/where    #eg without the name...

विकल्प के रूप में भी, आप उपयोग कर सकते हैं

find "$1" -print | grep "$@" 

तथा

findcc directory grep_options

पसंद

findcc . -P '/Robert\.(h|cpp)$'

1

बैश ग्लबिंग का उपयोग करना (यदि findयह आवश्यक नहीं है)

ls Robert.{pdf,jpg} 

0

एलएस के साथ पूरी तरह से: (-एल के लिए छिपे हुए फ़ोल्डर शामिल करें)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.