2009-09-19 2 views
100

Я просто хочу получить файлы из текущего каталога и выводить только файлы .mp4 .mp3 .exe. Так я думал, что я мог бы просто сделать это:Список файлов с определенными расширениями с ls и grep

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

Но нет, как первый Grep будет выводить только mp4-х для этого 2 других Grep-х не будет использоваться.

Любые идеи? PS, Запуск этого скрипта на медленном леопарде.

+0

Это действительно неправильный подход - вместо того, чтобы использовать Grep, используйте 'shopt -s nullglob', а затем просто обратитесь к' * .exe * .mp3 * .mp4'. См. Http://mywiki.wooledge.org/ParsingLs –

ответ

237

Почему нет:

ls *.{mp3,exe,mp4} 

Я не уверен, где я узнал, - но я использую это.

+0

Сладкий и простой! –

+1

Это довольно ответчик steller – Macdiesel

+0

Это не работает для меня, потому что расширение, которое я использую, предназначено для каталога, поэтому ls перечисляет содержимое каталога. –

27

egrep - расширенная Grep - поможет здесь

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

должен делать эту работу.

+0

Thats it! Спасибо Просто понял, что я должен иметь его регистр без учета регистра, поэтому я использую: ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ Если кому-то еще понадобится помощь с этим днем. Я всегда удивляюсь тому, как быстро я получаю свой ответ здесь. – Mint

+0

Я не вижу, как это будет работать. ls без каких-либо параметров производит вывод в столбцах. Анкеровка до конца строки не будет соответствовать должным образом. – camh

+4

@camh: 'ls' к терминалу (или с опцией' -C') производит вывод из нескольких столбцов. 'ls' для канала (или с' -1') имеет один вывод столбца. (Сравните вывод 'ls' с' ls | cat'). – mob

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

Не могли бы вы объяснить, пожалуйста, пожалуйста? –

+0

Спасибо, но немного неудобно, используя несколько строк. – Mint

+0

Этот + 'mdfind' дает лучшие/быстрые поиски КОГДА-ЛИБО! 'mdfind -name querystring | grep "\ .h $" находит все заголовки с quesrystring в заголовке файла. Пронто. –

9

самый простой способ это просто использовать Ls

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

Спасибо, но я уже пробовал это, и мне не нравились ошибки, которые вы получаете, когда нет файла. Я мог бы зафиксировать это: ls * .mp4 * .mp3 * .exe 2>/dev/null Только подумал об этом сейчас: P – Mint

+0

Я удивлен, что 'ls' не имеет своего рода тихой опции. – MitMaro

+0

Нет, что я мог найти. – Mint

5

Нет необходимости Grep. Символы Shell будут делать трюк.

ls *.mp4 *.mp3 *.exe 

Если вы запустили

shopt -s nullglob 

затем непарные шарики будут удалены в целом, а не оставлять в командной строке нераспространенной.

Если вы хотите нечувствительны к регистру подстановку (так * .mp3 будет соответствовать foo.MP3):

shopt -s nocaseglob 
+0

Тот же комментарий, что и я дал Tribe Good Time. – 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 

Это защищает имена файлов, которые содержат пробелы или символы новой строки.

OS X find поддерживает только чередование, если используется опция -E (усиленная).

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

В Mac OS X: 'find. -iregex '. * \ (mp3 \ | mp4 \ | exe \)' ' – andi

+3

andi, это не сработало для меня на mac os. Но это так: найти -E. -regex '. * (mp3 | mp4 | exe)' –

+0

Это решение будет загружать файлы, такие как: 'mysupermp3.jpg' рассмотреть возможность добавления' '' в конце регулярного выражения и '\\.' перед расширениями – Panthro

2

ls -R | findstr ".mp3"

ls -R => перечисляет подкаталоги рекурсивно

3

Для пользователей OSX:

Если вы используете ls *.{mp3,exe,mp4}, он выдаст ошибку, если один из этих расширений имеет нет результатов.

Использование ls *.(mp3|exe|mp4) вернет все файлы, поддерживающие эти расширения, , даже если одно из указанных расширений имеет 0 результатов.

+3

Я получил синтаксическую ошибку, используя ваш пример ??? 'bash: синтаксическая ошибка возле неожиданного токена '(' – nagordon

+0

Это работает для меня на OSX, вы используете linux? – james2doyle

+0

Linux mint (debian) – nagordon

0

Вот один пример, который сработал для меня.

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename 
Смежные вопросы