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:
-
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 denominadomp3
. -
Lide com casos específicos . Aqui, ele processará o arquivo temporário
m4a
e criará os dois outros arquivosm4a_aac
em4a_alac
com base no teste que você forneceu na pergunta. -
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