Получить все расширения и их количество файлов в каталоге

Получить все расширения для каталога: легко. Получение количества файлов для определенного расширения: легко.

Но получение всех расширений файлов и их соответствующего количества файлов намекает на меня.

например.

+ dir
 + abc.txt
 + def.txt
 + abc.pdf
 * def.pov

должен вернуть что-то вроде:

.txt 2
.pdf 1
.pov 1

Цель этого упражнения - узнать, какое расширение файла популярно в определенном каталоге.

заранее спасибо

3 ответа

Решение
/var/cache$ sudo find ./ -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
      1 .6
      1 .cache
      1 .noconf
      1 .php
      1 .sl
      2 .bin
      2 .el
      2 .tdb
      4 .baseA
      4 .baseB
      4 .dat
      4 .DB
     27 .db
    221 .deb

Вот экспликация:

find ./ -type f

найти только файл, а не каталог

grep -E ".*\.[a-zA-Z0-9]*$"

файл фильтра с расширением

sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/'

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

sort | uniq -c | sort -n

сортировать, уникально и сортировать

Поскольку вы используете Linux (gnu grep), сейчас хорошее время для использования Perl RE (PCRE) -P и grep -oвариант. Принимая ответ @bindbn как отличный кандидат:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n

У меня была такая же проблема, и я нашел следующее решение:

      find . -type f | rev | cut -d "." -f 1 | rev | sort | uniq -c | sort -n

Это очень похоже на другие решения, предложенные здесь, но, возможно, их легче понять/запомнить и, возможно, немного быстрее. Это также позволяет избежать обычной головной боли, связанной с именами файлов, содержащими специальные символы.

переворачивает строку имени файла, извлекает (перевернутое) расширение файла до "." разделитель и переворачивает подстроку расширения, затемподсчитывает экземпляры каждого расширения и печатает результат в порядке возрастания совпадений.

Другие вопросы по тегам