2009-09-19 16 views
100

के साथ कुछ एक्सटेंशन वाले फ़ाइलों की सूची मैं बस वर्तमान डीआईआर से फ़ाइलें प्राप्त करना चाहता हूं और केवल आउटपुट .mp4 .mp3 .exe फ़ाइलों को और कुछ भी नहीं करना चाहता हूं। तो मैंने सोचा कि मैं तो बस ऐसा कर सकता है:ls और grep

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$ 

लेकिन नहीं, पहले ग्रेप इच्छा उत्पादन सिर्फ mp4 की वजह अन्य 2 ग्रेप के रूप में उपयोग नहीं किया जाएगा।

कोई विचार? पीएस, धीमी तेंदुए पर इस स्क्रिप्ट को चला रहा है।

+0

यह वास्तव में गलत दृष्टिकोण है - ग्रेप उपयोग करने के बजाय, shopt -s nullglob' का उपयोग 'और फिर बस' * .exe * .mp3 * .mp4' को देखें। देखें http://mywiki.wooledge.org/ParsingLs –

उत्तर

237

नहीं क्यों:

ls *.{mp3,exe,mp4} 

मैं नहीं यकीन है कि जहां मैं इसे सीखा हूँ - लेकिन मैं इस का उपयोग कर रहा है।

+0

मीठे और सरल! –

+1

यह एक सुंदर स्टेलर उत्तर है – Macdiesel

+0

यह मेरे लिए काम नहीं कर रहा है क्योंकि मैं जिस एक्सटेंशन का उपयोग कर रहा हूं वह निर्देशिका के लिए है, इसलिए ls निर्देशिका की सामग्री सूचीबद्ध कर रहा है। –

27

egrep - विस्तारित ग्रेप - यहाँ

ls | egrep '\.mp4$|\.mp3$|\.exe$' 

मदद काम करना चाहिए होगा।

+0

यह बात है! धन्यवाद बस एहसास हुआ कि मुझे यह मामला असंवेदनशील होना चाहिए, इसलिए मैं इसका उपयोग कर रहा हूं: ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ किसी और को किसी एक दिन के साथ मदद की ज़रूरत है। मैं हमेशा इस गति से आश्चर्यचकित हूं कि मुझे यहां मेरा जवाब मिल गया है। – Mint

+0

मैं नहीं देख सकता कि यह कैसे काम करेगा। बिना किसी विकल्प के एलएस कॉलम में आउटपुट उत्पन्न करता है। लाइन के अंत तक लंगर ठीक से मेल नहीं खाएगा। – camh

+4

@camh: टर्मिनल के लिए 'ls' (या '-C' विकल्प के साथ) बहु-कॉलम आउटपुट उत्पन्न करता है। एक पाइप (या '-1' के साथ) 'ls') में एकल कॉलम आउटपुट होता है। ('एलएस' बिल्ली के साथ 'एलएस' के आउटपुट की तुलना करें)। – mob

2
ls | grep "\.mp4$ 
\.mp3$ 
\.exe$" 
+0

क्या आप नीचे दिए गए वोट की व्याख्या कर सकते हैं? –

+0

धन्यवाद, लेकिन कई लाइनों का उपयोग कर थोड़ा असुविधाजनक। – Mint

+0

यह + 'mdfind' कभी भी सबसे अच्छी/तेज़ खोजों को उत्पन्न करता है! 'mdfind -name querystring | grep "\ .h $" 'फ़ाइल शीर्षक में quesrystring के साथ सभी शीर्षलेखों को पाता है। Pronto। –

9

सबसे आसान तरीका है बस ls

ls *.mp4 *.mp3 *.exe 
+1

धन्यवाद, लेकिन मैंने पहले से ही कोशिश की है और मुझे कोई फ़ाइल नहीं होने पर आपको मिली त्रुटियों को पसंद नहीं आया। आप यह तय कर सकते हैं कि: ls * .mp4 * .mp3 * .exe 2>/dev/null केवल इस बारे में सोचा था कि आप: पी – Mint

+0

मुझे आश्चर्य है कि 'ls' में कुछ प्रकार नहीं है चुप विकल्प का। – MitMaro

+0

कोई भी जो मुझे मिल सकता है। – Mint

5

ग्रेप के लिए कोई ज़रूरत नहीं उपयोग करने के लिए है। शेल वाइल्डकार्ड चाल करेगा।

ls *.mp4 *.mp3 *.exe 

आप

shopt -s nullglob 

तो बेजोड़ globs पूरी तरह और नहीं निकाल दिया जाएगा चलाया है, तो कमांड लाइन अविस्तारित पर नहीं छोड़ा जा सकता।

यदि आप चाहते हैं केस-संवेदी ग्लोबिंग (ताकि * .mp3 foo.MP3 से मेल खाएगी):

shopt -s nocaseglob 
+0

वैसे टिप्पणी जैसा कि मैंने गुड टाइम जनजाति को दिया था। – Mint

7

शायद ज़रुरत पड़े: तुम क्यों find का उपयोग नहीं करते?

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4' 
+0

धन्यवाद! वास्तव में मुझे क्या चाहिए। – Stratus3D

4

मामले में आप अभी भी एक वैकल्पिक समाधान के लिए देख रहे हैं:

ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$' 

यदि आवश्यक हो तो अधिक -e झंडे को जोड़ने के लिए स्वतंत्र महसूस।

35

उपयोग find साथ नियमित अभिव्यक्ति:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n' 

आप फ़ाइल नाम पाइप रहे हैं:

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething 

इस फ़ाइल नाम है कि रिक्त स्थान या नई-पंक्तियों को शामिल सुरक्षा करता है।

ओएस एक्स find केवल -E (बढ़ाया गया) विकल्प का उपयोग करने पर वैकल्पिकता का समर्थन करता है।

find -E . -regex '.*\.(mp3|mp4|exe)' 
+2

मैक ओएस एक्स पर: 'ढूंढें। -रेगेक्स '। * \ (एमपी 3 \ | एमपी 4 \ | exe \)' – andi

+3

एंडी, जो मैक ओएस पर मेरे लिए काम नहीं करता था। लेकिन यह किया: find -E। -regex '। * (एमपी 3 | एमपी 4 | exe)' –

+0

यह समाधान फाइलों को लोड करेगा: 'mysupermp3.jpg' रेगेक्स के अंत में' $ 'जोड़ने और एक्सटेंशन से पहले '0'' जोड़ने पर विचार करें – Panthro

2

ls -R | findstr ".mp3"

ls -R => उपनिर्देशिका को सूचीबद्ध रिकर्सिवली

3

OSX उपयोगकर्ताओं के लिए:

आप का उपयोग करते हैं ls *.{mp3,exe,mp4}, यह अगर उन एक्सटेंशन में से एक है एक त्रुटि फेंक होगा कोई परिणाम नहीं।

ls *.(mp3|exe|mp4) का उपयोग उन एक्सटेंशन से मेल खाने वाली सभी फ़ाइलों को वापस कर देगा, यदि एक्सटेंशन में से कोई एक 0 परिणाम था।

+3

मुझे आपके उदाहरण का उपयोग कर एक वाक्यविन्यास त्रुटि मिली ??? 'bash: अप्रत्याशित टोकन के पास वाक्यविन्यास त्रुटि' (' – nagordon

+0

यह ओएसएक्स पर मेरे लिए काम करता है, क्या आप लिनक्स का उपयोग कर रहे हैं? – james2doyle

+0

लिनक्स टकसाल (डेबियन) – nagordon

0

यहां एक उदाहरण है जो मेरे लिए काम करता है।

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename