Получить все расширения и их количество файлов в каталоге
Получить все расширения для каталога: легко. Получение количества файлов для определенного расширения: легко.
Но получение всех расширений файлов и их соответствующего количества файлов намекает на меня.
например.
+ 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
Это очень похоже на другие решения, предложенные здесь, но, возможно, их легче понять/запомнить и, возможно, немного быстрее. Это также позволяет избежать обычной головной боли, связанной с именами файлов, содержащими специальные символы.