Список файлов с определенными расширениями с ls и grep
Я просто хочу получить файлы из текущего каталога и только output. mp4 .mp3.EXE файлы, больше ничего.
Поэтому я подумал, что могу просто сделать это:
ls | grep .mp4$ | grep .mp3$ | grep .exe$
но нет, так как первый grep будет выводить только mp4, поэтому другие 2 grep не будут использоваться.
какие идеи? PS, запускаем этот скрипт на Slow Leopard.
11 ответов:
использовать регулярные выражения с
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$'должен делать свою работу.
на всякий случай: почему бы вам не использовать
find?find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'
нет необходимости в grep. Подстановочные знаки оболочки сделают трюк.
ls *.mp4 *.mp3 *.exeпри использовании
shopt -s nullglobтогда несопоставимые глобусы будут удалены полностью и не будут оставлены в командной строке нерасширенными.
Если вы хотите без учета регистра глобирования (так *. mp3 будет соответствовать foo. MP3):
shopt -s nocaseglob
Если вы все еще ищете альтернативное решение:
ls | grep -i -e '\.tcl$' -e '\.exe$' -e '\.mp4$'Не стесняйтесь добавлять больше -е флаги, если это необходимо.
для пользователей OSX:
Если вы используете
ls *.{mp3,exe,mp4},он выдаст ошибку если одно из этих расширений не имеет никаких результатов.используя
ls *.(mp3|exe|mp4)вернет все файлы с такими расширениями, даже если одно из расширений имело 0 результатов.
вот один пример, который работал для меня.
find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
Comments