Сценарий Bash для подсчета типов файлов в пути (включая подпапки)

Я хотел бы получить краткий обзор различных типов файлов в каталоге (включая все его подкаталоги) с помощью инструмента file , например, рассказывая мне, какой тип файла является наиболее распространенным.

Он должен быть реализован как практический сценарий оболочки в общих языках оболочки или скриптовых инструментах, таких как bash или awk .

Возможные приятные для использования:

  • хорошая производительность
  • работа с любым именем или типом файла
  • Совместимость с POSIX

(последние две точки практически взаимоисключающие)

  • Как я могу игнорировать «zip warning: name not match» при использовании команды zip с опцией -d?
  • Почему код выхода скрипта имеет другое значение, чем то, что возвращается?
  • Сокращенное обозначение boolean
  • Как я могу загрузить несколько файлов в мой .bashrc?
  • Извлечь файлы с определенным расширением файла и сохранить структуру каталогов?
  • wait bash-builtin сжигает CPU на 100 процентов
  • Как удалить файлы с пробелами в них в сценарии bash?
  • Как вызвать сброс сторожевого таймера моего встроенного Linux-устройства
  • 2 Solutions collect form web for “Сценарий Bash для подсчета типов файлов в пути (включая подпапки)”

    Использовать sort | uniq -c sort | uniq -c для подсчета одинаковых строк:

     find "$path" -type f -exec file -b {} + | sort | uniq -c | sort -nr 

    Bash 4 с использованием ассоциативных целых массивов и для сред с расширениями с нулевым разделителем. Первым параметром является целевой каталог, все следующие параметры пересылаются в file :

     #!/bin/bash # USAGE: script.sh PATH [PARAMS_FOR_FILE_CMD...] # EXAMPLE 1: ./script.sh . # EXAMPLE 2: ./script.sh /tmp --mime-type path=$1 shift if [[ ! -d "$path" ]]; then echo 'Path expected as first argument!' >&2 echo "Usage: $(basename "$0") PATH [PARAMS_FOR_FILE_CMD...]" >&2 exit 1 fi declare -Ai type_stats while IFS= read -r -d '' f; do t=$(file -b "$@" -- "$f") type_stats[$t]+=1 done < <(find "$path" -type f -print0) for t in "${!type_stats[@]}"; do printf '\n%s\n-> %s\n\0' "$t" "${type_stats[$t]}" done | sort -zrn -t'>' -k2 

    Производительность должна быть в порядке, и я предполагаю, что она имеет дело со всеми именами и типами файлов (хотя это не совсем верно, например, если в нем нет типа «>»).

    Interesting Posts

    Выполняется ли команда автоматически при настройке переменной?

    Шифрование файлов (закрытый ключ и т. Д.) Во встроенной системе

    Невозможно скомпилировать ядро ​​в gentoo

    Являются ли два файла жестко привязанными?

    Совместить данные из двух разных файлов

    Как я могу перенастроить свое ядро ​​2.6.37.6 для Ubuntu для сжатия до 950 КБ или меньше?

    Что такое эквивалент Fedora /var/lib/dpkg/info/.prerm?

    Geany: открыть новый экземпляр для каждой рабочей области при открытии файла в этой рабочей области

    Могут ли каталоги и файлы наследовать те же разрешения, что и родительский каталог?

    Как использовать мой кросс-компилятор для компиляции?

    Awk для удаления строки, если аргумент встречается в определенном столбце

    Заблокировать пакет для удаления в APT

    Настройка Python для включения другого каталога при поиске пакетов

    strace работает для некоторых встроенных команд

    Как я могу использовать апостроф в методе отправки для mutt?

    Linux и Unix - лучшая ОС в мире.