Encontre, conte e classifique todos os arquivos de áudio. Arquivos ALAC (M4A)

3

Estou montando um script para classificar uma coleção de músicas muito grande. São aproximadamente 22.000 álbuns, uma mistura de FLAC, WAV, AIFF, M4A (AAC e ALAC).

Até agora, posso classificar por tipo de arquivo e obter um tamanho total de cada tipo.

ftypes=$(find . -type f | grep -iE ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$//' | 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

Eu gostaria de editar isso para obter o número de arquivos por tipo de arquivo, bem como o tamanho total.

Agora, os arquivos M4A podem ser AAC ou ALAC e eu gostaria de saber quantos de cada um deles.

Eu posso encontrar e imprimir uma lista de arquivos do ALAC com

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

mas estou perdido sobre como obter a contagem e o tamanho total de arquivos, em vez de uma lista de nomes de arquivos, e combiná-los todos em um script.

Basicamente, gostaria de produzir:

  • Lista de tipos de arquivo
  • Número de arquivos por tipo de arquivo
  • Tamanho total por tipo de arquivo
  • M4A número total de AAC & tamanho total
  • M4A número total de ALAC & tamanho total

Dependendo de como isso funciona, posso considerar usar isso para classificar arquivos em diretórios com base na saída.

    
por Lowey 06.06.2015 / 07:37

1 resposta

4

Você deve decompor seu objetivo em várias etapas mais fáceis de resolver. Isso terá duas vantagens:

  • Será mais fácil resolver,
  • O código resultante será mais claro e mais reutilizável.

Os scripts abaixo basicamente seguem estas etapas:

  1. Gere arquivos estatísticos brutos . Uma maneira fácil é acrescentar o tamanho do arquivo e o nome do arquivo em um arquivo temporário com o nome da extensão do arquivo original. Portanto, se você tiver o arquivo /path/to/foo.mp3 que é 3000000 grande, ele anexará 3000000 /path/to/foo.mp3 no final de um arquivo temporário denominado mp3 .
  2. Lide com casos específicos . Aqui, ele processará o arquivo temporário m4a e criará os dois outros arquivos m4a_aac e m4a_alac com base no teste que você forneceu na pergunta.
  3. Gerar saída . Toda a informação necessária está agora disponível, apenas tem que:
    • Conte o número de linhas em cada arquivo temporário para determinar o número de arquivos desse tipo
    • Resuma cada tamanho para obter o tamanho total dos arquivos desse tipo.

Aqui está o script:

#!/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"
# For Mac: stat -f "%z %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
    input="$statsdir/m4a"
    while IFS= read -r line; 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 < "$input"
    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
    
por 06.06.2015 / 09:48