Список файлов с определенными расширениями LS и grep
Я просто хочу получить файлы из текущего dir и только вывод.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)'
на всякий случай: почему бы вам не использовать 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 результатов.
вот один пример, который сработал для меня.
find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename