Поиск, подсчет и сортировка всех аудиофайлов. Файлы 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 
  • Как я могу обнаружить оболочку без входа? (В Zsh)
  • Удаление непустого каталога с помощью smbclient
  • Как заставить tcsh не вставлять пробелы в команду, которая охватывает несколько строк
  • Универсальная альтернативная альтернатива non-bash `time`?
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Чтение нескольких записей из входного файла
  • Обработать список файлов с пробелом в именах файлов
  • Как распечатать последнее слово, которое содержит разделитель поля
  • Как работает эта функция bash?
  • Запретить удаление файла даже после того, как rm -f
  • Установить идентификатор родительского процесса из ShellScript, позже удалить все дочерние процессы
  • Linux и Unix - лучшая ОС в мире.