Список файлов с определенными расширениями с помощью ls и grep - PullRequest
131 голосов
/ 19 сентября 2009

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

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

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

Есть идеи? PS, запуск этого скрипта на Slow Leopard.

Ответы [ 11 ]

301 голосов
/ 19 сентября 2009

Почему бы и нет:

ls *.{mp3,exe,mp4}

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

41 голосов
/ 19 сентября 2009

Используйте регулярные выражения с 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)'
32 голосов
/ 19 сентября 2009

egrep - расширенный grep - здесь поможет

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

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

11 голосов
/ 19 сентября 2009

самый простой способ - просто использовать ls

ls *.mp4 *.mp3 *.exe
8 голосов
/ 19 сентября 2009

На всякий случай: почему бы вам не использовать find?

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'
5 голосов
/ 19 сентября 2009

Нет необходимости в grep. Подстановочные знаки Shell сделают свое дело.

ls *.mp4 *.mp3 *.exe

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

shopt -s nullglob

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

Если вы хотите использовать глобализацию без учета регистра (поэтому * .mp3 будет соответствовать foo.MP3):

shopt -s nocaseglob
4 голосов
/ 05 марта 2015

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

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

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

4 голосов
/ 19 сентября 2009

Если вы все еще ищете альтернативное решение:

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

Не стесняйтесь добавлять дополнительные флаги -e, если это необходимо.

2 голосов
/ 24 декабря 2013

ls -R | findstr ".mp3"

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

2 голосов
/ 19 сентября 2009
ls | grep "\.mp4$
\.mp3$
\.exe$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...