Поиск, подсчет и сортировка всех аудиофайлов. Файлы ALAC (M4A)

Я собираю сценарий для сортировки очень большой коллекции музыки. Это около 22000 альбомов, смесь FLAC, WAV, AIFF, M4A (AAC & ALAC).

До сих пор я могу сортировать по типу файла и получать общий размер каждого типа.

ftypes=$(find . -type f | grep -iE ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort -f | uniq -i) for ft in $ftypes do echo -n "$ft " find . -name "*${ft}" -print0 | xargs -0 du -hc | grep total | awk '{print $1}' done 

Я хотел бы отредактировать это, чтобы получить количество файлов по типу файла, а также общий размер.

Теперь файлы M4A могут быть либо AAC, либо ALAC, и я хотел бы знать, сколько из них.

Я могу найти и распечатать список файлов ALAC с помощью

 find . -name \*.m4a | while read file; do avprobe "$file" 2>&1 | grep -q 'Audio: alac' && echo "$file"; done 

но я теряюсь на том, как получить общее количество файлов и размер, а не список имен файлов и объединить все это в один скрипт.

В принципе, я хотел бы вывести:

  • Список типов файлов
  • Количество файлов по типу файлов
  • Общий размер по типу файла
  • M4A общее количество AAC и общий размер
  • M4A общее количество ALAC и общий размер

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

One Solution collect form web for “Поиск, подсчет и сортировка всех аудиофайлов. Файлы ALAC (M4A)”

Вы должны разложить свою цель на несколько шагов, которые легче решить. Это будет иметь два преимущества:

  • Это будет проще решить,
  • Полученный код будет более понятным и более многоразовым.

Ниже приведенные ниже сценарии следуют следующим шагам:

  1. Генерировать исходные статистические файлы . Простым способом является добавление размера файла и имени файла во временный файл с именем после расширения исходного файла. Итак, если у вас есть файл /path/to/foo.mp3 которого 3000000, он добавит 3000000 /path/to/foo.mp3 в конце временного файла с именем mp3 .
  2. Обращайтесь с конкретными случаями . Здесь он обработает временный файл m4a и создаст два других файла m4a_aac и m4a_alac на основе теста, который вы дали в вопросе.
  3. Создать выход . Вся необходимая информация теперь доступна, она просто должна:
    • Подсчитайте количество строк в каждом временном файле, чтобы определить количество файлов этого типа,
    • Суммируйте каждый размер, чтобы получить общий размер файлов этого типа.

Вот сценарий:

 #! /bin/sh # This script takes the searched directory as first parameter. # For instance: ./this-script.sh ~/Music : ${1:?"You must pass the search directory as first parameter."} searchdir="$1" # Create a temporary directory statsdir="" trap 'rm -rf $statsdir' EXIT statsdir=$(mktemp -d "/tmp/tmp.XXXXXXXXXX") || exit 1 # Generate one listing file per extension awkscript='/\.[[:alnum:]]+$/ {print $0 >statsdir"/"$(NF)}' # For Linux: stat -c "%s %n" find "$searchdir" -type f -exec stat -f "%z %N" {} + | \ awk -F '.' -v statsdir="$statsdir" "$awkscript" # Distinguish between m4a/AAC and m4a/ALAC if [ -f "$statsdir/m4a" ]; then for line in $(read "$statsdir/m4a"); do filename=${line#* } if avprobe "$filename" 2>&1 | grep -q 'Audio: alac'; then echo "$line" >"$statsdir/m4a_alac else echo "$line" >"$statsdir/m4a_aac fi done rm "$statsdir/m4a" fi # Generate and display result { printf "Type Count Size\n" for extension in $(ls "$statsdir"); do count=$(wc -l "$statsdir/$extension" | cut -d ' ' -f 1) totalsize=$(awk '{s+=$1} END {print s}' "$statsdir/$extension") printf "%s %d %d\n" "$extension" "$count" "$totalsize" done } | column -t 
  • Обновить имя процесса в оболочке, возможно ли это?
  • Как разработать несколько выбранных файлов путем перетаскивания в сценарий bash
  • Как удалить место во всех подкаталогах в сценарии оболочки?
  • Как разбить длинную строку на несколько строк в подсказке read -p в исходном коде?
  • Каковы некоторые из наиболее полезных алиасов и сценариев bash?
  • Чтение полей ввода, разделенных пробелами
  • Установка XDG_DATA_HOME и XDG_CONFIG_HOME для компиляции / для каждой программы
  • Создание туннеля openvpn в сценарии bash
  • Удалить дубликаты из базовых имен в двух файлах
  • Удалите x строк до и y строк после n-й строки (которая соответствует шаблону) в файле
  • запись вывода xbacklight -get в переменную в сценарии bash
  • Linux и Unix - лучшая ОС в мире.