すべてのオーディオファイルを検索、計算、並べ替えます。 ALAC(M4A)ファイル

すべてのオーディオファイルを検索、計算、並べ替えます。 ALAC(M4A)ファイル

私は非常に大きな音楽コレクションを並べ替えるスクリプトを書いています。 FLAC、WAV、AIFF、M4A(AAC、ALAC)が混在した約22,000枚のアルバムがあります。

これまでは、ファイルの種類別に並べ替え、各タイプの合計サイズを取得できます。

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

しかし、ファイル名のリストの代わりにファイルの総数とサイズを取得して、すべてを1つのスクリプトにまとめる方法がわかりません。

基本的に以下を出力したいと思います。

  • ファイル形式一覧
  • ファイルタイプ別ファイル数
  • ファイル形式別の合計サイズ
  • M4A AACフルサイズとフルサイズ
  • M4A ALACの総数と総サイズ

どれだけうまく機能するかに応じて、出力に基づいてファイルをディレクトリにソートするために使用することを検討することができます。

ベストアンサー1

目標をより扱いやすい段階に分ける必要があります。これには2つの利点があります。

  • 解決しやすくなります。
  • 生成されたコードはよりきれいになり、再利用が可能になります。

以下のスクリプトはデフォルトで次の手順に従います。

  1. 生統計ファイルの生成。簡単な方法は、元のファイル拡張子と呼ばれる一時ファイルにファイルサイズとファイル名を追加することです。したがって、ファイルサイズが3000000の場合、名前は一時ファイルの末尾に/path/to/foo.mp3追加されます。3000000 /path/to/foo.mp3mp3
  2. 特定のイベントを処理する。ここでは、質問に提供したテストに基づいて一時ファイルを処理し、他のm4a2つのファイルを生成しますm4a_aacm4a_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"
# 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

おすすめ記事