Список файлов с определенными расширениями LS и grep

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

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

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

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

11 ответов


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

ls *.{mp3,exe,mp4}

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


использовать регулярные выражения с find:

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

если вы передаете имена файлов:

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

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

OS X find поддерживает только чередование, когда (улучшенный) вариант.

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

egrep -- extended grep -- поможет здесь

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

должен выполнить работу.


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

ls *.mp4 *.mp3 *.exe

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

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

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

ls *.mp4 *.mp3 *.exe

при использовании

shopt -s nullglob

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

Если вы хотите без учета регистра подстановка (так *.MP3 будет соответствовать ФОО.МР3):

shopt -s nocaseglob

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

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

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


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

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

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


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

ls -R | findstr ".mp3"

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


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

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