Эти решения работают на bash. Я не уверен, хотите ли вы номер каждого типа файла или общее количество.
Если вы хотите общее количество файлов изображений, попробуйте это:
ls {*jpg,*png,*gif} | wc -l
Это означает , что ls
- нибудь окончание в jpg
png
или gif
и трубы через wc
Если вы хотите номер каждого, сделайте:
for n in jpg png gif; do echo -ne "$n\t"; ls *$n | wc -l; done
Это для цикла. Он будет запущен 3 раза, по одному для каждого из JPG PNG и GIF. Каждый раз при запуске цикла переменная $n
принимает одно из расширений в качестве значения. Итак, для первого запуска ls *$n
будет расширен до ls *jpg
. echo
сути просто означает "печать". echo -ne
означает печать без новой строки (-n
) и позволяет использовать escape-символы -e
, это позволяет мне использовать символ табуляции \t
.
Это будет хорошо работать, если у вас есть хотя бы один файл каждого типа, в противном случае он будет жаловаться (он все равно будет работать, он будет только жаловаться). Для чуть более надежной версии попробуйте это:
for n in jpg png gif; do echo -ne "$n\t"; echo `ls *$n 2>/dev/null | wc -l ` || echo 0; done
Этот цикл аналогичен приведенному выше, но проверяет, возвращает ли команда ls
ошибку. ||
Операнд в bash означает «Сделай это или, если это не сработало, сделай это ». Итак, я говорю bash для ls *jpg
т.д., И если он не работает, т.е. если нет файлов с таким расширением, echo (print) 0
. 2>/dev/null
приводит к тому, что любые сообщения об ошибках отбрасываются.
Вы также можете использовать awk (это небольшая модификация ответа mauro stettler, поэтому он будет считать только файлы с интересующими вас расширениями):
ls {*.jpg,*.png,*.gif} | awk -F'.' '{print $NF}' | sort | unic -c