फ़ाइलों को ls और grep के साथ कुछ एक्सटेंशन के साथ सूचीबद्ध करें


153

मैं सिर्फ वर्तमान dir से फ़ाइलें प्राप्त करना चाहता हूं और केवल आउटपुट .mp4 .mp3 .exe फ़ाइलें और कुछ नहीं। इसलिए मैंने सोचा कि मैं बस यही कर सकता हूं:

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

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

कोई विचार? धीरे तेंदुए पर इस स्क्रिप्ट को चलाने वाले पी.एस.


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

1
मैं यह नहीं पता लगा सकता हूं कि "स्लो तेंदुआ" टाइपो था या नहीं ...
Wowfunhappy

1
@Wowfunhappy hahaha, निश्चित रूप से एक टाइपो था, मुझे याद है कि स्नो लेपर्ड काफी तेज था।
मिंट

जवाबों:


336

क्यों नहीं:

ls *.{mp3,exe,mp4}

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


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

1
@RichardVenable निर्देशिकाओं को पुन: व्यवस्थित करने से रोकने के लिए -d स्विच जोड़ें।
कार्लोस यूजेनियो थॉम्पसन पिनज़ॉन

11
मुझे यह समाधान पसंद है, लेकिन अगर आप किसी एक फिल्म को याद कर रहे हैं तो यह विफल हो रहा है। उदाहरण के लिए, आपके पास एमपी 3 है लेकिन नहीं .exe (मैक OSX, zsh)
JHo

2
मैं ls: *.exe: No such file or directoryउदाहरण के लिए stderr को / dev / null पर पुनर्निर्देशित करता हूं :ls *.{zip,tar.gz,tar} 2>/dev/null
Isaac

1
जब मैं ls foo * चलाता हूं। {tar.gz, zip} सीधे एक शेल में काम करता है, लेकिन जब इसे शेल स्क्रिप्ट के अंदर रखा जाता है तो नवीनतम = $ (ls -I) .done '-tr $ {pkgprefix} {टार। gz, zip} | tail -1) मुझे एक त्रुटि संदेश मिला: ls: 'bamtools * का उपयोग नहीं कर सकता। {tar.gz, zip}': ऐसी कोई फ़ाइल या निर्देशिका नहीं, कोई भी होशियार आदमी उत्तर को परिष्कृत कर सकता है।
केमिन झोउ

41

इसके साथ नियमित अभिव्यक्ति का उपयोग करें 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
Mac OS X पर:find . -iregex '.*\(mp3\|mp4\|exe\)'
andilabs

3
andi, कि मैक ओएस पर मेरे लिए काम नहीं किया। लेकिन यह किया: खोजने -E। -रिगेक्स '। * (एमपी। | mp4 | exe)'
जोसेफ जॉनसन

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

1
@ पैंत्रो: वास्तव में, यह नहीं होगा। प्रतीत होता है कि इसमें निहित एंकर का उपयोग किया गया है। डॉट एक अच्छा विचार है (केवल एक बैकस्लैश की आवश्यकता है)।
अगली सूचना तक रोक दिया गया।

39

egrep विस्तारित grep - यहाँ मदद करेगा

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

काम करना चाहिए।


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

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

4
@camh: lsएक टर्मिनल (या -Cविकल्प के साथ ) मल्टी-कॉलम आउटपुट का उत्पादन करता है। lsएक पाइप के लिए (या साथ -1) एकल स्तंभ आउटपुट है। (के उत्पादन की तुलना lsके साथ ls | cat)।
भीड़

वहाँ अंत में एक लापता apostrophe है। इसके अलावा यह काम करने लगता है।
ब्योर्न

12

सबसे आसान तरीका सिर्फ ls का उपयोग करना है

ls *.mp4 *.mp3 *.exe

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

1
मुझे आश्चर्य है कि lsकिसी प्रकार का मौन विकल्प नहीं है।
मितमरो

2
बैश में, आप "सेट-नो नलग्लोब" कर सकते हैं, और आपको त्रुटियाँ नहीं मिलेंगी।
कैम

2
मेरी गलती - कि "shops -s nullglob" सेट-कमांड नहीं होना चाहिए
Camh

1
या बस "इको": इको * .mp4 * .mp3 * .exe का उपयोग करें
एड्रियन प्रोक

9

बस के मामले में: आप का उपयोग क्यों नहीं करते find?

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

मैंने पाया कि इसके बजाय काम किया - find . -name '*.mkv' -o -name '*.flv'(आवश्यकतानुसार कई-के खंड जोड़ते हुए)। मुझे .निर्देशिका और ध्वज को इंगित करने की आवश्यकता थी - मैं macOS 10.13 पर -nameनहीं -inameहूं।
क्रिस

6

Grep की कोई आवश्यकता नहीं है। शेल वाइल्डकार्ड चाल चलेंगे।

ls *.mp4 *.mp3 *.exe

अगर आप दौड़े हैं

shopt -s nullglob

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

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

shopt -s nocaseglob

जैसा कि मैंने गुड टाइम ट्राइब को दिया था, उसी तरह की टिप्पणी।
मिंट

1
मैं -Rउपनिर्देशिकाओं में मेल खाने वाली फ़ाइलों को सूचीबद्ध करने के विकल्प के साथ इसका उपयोग करने की कोशिश कर रहा हूं, लेकिन विकल्प का कोई प्रभाव नहीं दिखता है और मुझे अभी भी केवल वर्तमान निर्देशिका के परिणाम मिलते हैं।
क्रिस

3

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

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

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


3

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

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

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


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

2
मुझे लगता है कि आप का मतलब है ls *.@(mp3|exe|mp4)। इसके लिए आपको shopt -s extglobकाम करने की जरूरत है । वैसे, lsयह भी बेकार है, आप बस कर सकते हैं printf '%s\n' *.@(mp3|exe|mp4)
गनीउरफ_निगियॉर्फ

1
मुझे macOS 10.13 पर सिंटेक्स अनपेक्षित टोकन संदेश मिलता है
क्रिस

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

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

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

1

ls -R | findstr ".mp3"

ls -R => सूचियाँ उपनिर्देशिका पुनरावर्ती


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