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

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

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

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

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

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

  • Список всех ассоциаций расширения имени файла для данной программы
  • Как открыть файл в формате MIME?
  • Unix решает о типе файла, ищущего магические файлы при фиксированных смещениях. Как он может сделать это надежно?
  • 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 

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

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