1

Я использую Cygwin на Windows.

Я хочу посчитать количество файлов JPEG, GIF и PNG из корневой папки.

Теперь я могу сделать:

ls . -1R | grep '.jpeg' |  wc -l
ls . -1R | grep '.gif' |  wc -l
ls . -1R | grep '.png' |  wc -l

Но я подумал, что если бы здесь был синтаксис group by типу, я мог бы сделать это одной командой вместо трех?

Какие-нибудь советы?

3 ответа3

2

Попробуй это:

ls | awk -F '.' '{print $2}' | sort | uniq -c | sort -n

объяснение:

awk разбивает файлы на «.» и выводит вторую часть.

sort сортирует все выходные данные

uniq выполняет группировку и считает по группам

второй сортирует группы по количеству

Вероятно, есть способ улучшить его, сделав вывод awk последней частью, а не второй. Но я забыл, как это сделать, я уверен, что man awk может вам сказать.

1

Вы также можете использовать find:

find . -name \*.jpeg -o -name \*.gif -o -name \*.png | sed 's/.*\.\([^.]\+\)/\1/' | sort | uniq -c

Это возвращает количество файлов в . с расширениями jpeg , gif и png красиво отформатированными с одним результатом на строку:

 123 gif
 110 jpeg
1832 png

Добавьте другие расширения по мере необходимости.

Объяснение команды:

  • find . -name \*.jpeg -o -name \*.gif -o -name \*.png

    ищет файлы, которые совпадают с « .jpeg», «.gif» или «* .png».

  • sed 's/.*\.\([^.]\+\)/\1/'

    удаляет имя файла и оставляет только расширение, например, file.gif становится gif

  • sort

    сортировать расширения. После этой команды вывод выглядит так:

    gif
    gif
    gif
    (...)
    jpeg
    jpeg
    (...)
    png
    (...)
    
  • uniq -c

    сообщить количество вхождений.

1

Эти решения работают на 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 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .