私は非常に大きな音楽コレクションを並べ替えるスクリプトを書いています。 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つの利点があります。
- 解決しやすくなります。
- 生成されたコードはよりきれいになり、再利用が可能になります。
以下のスクリプトはデフォルトで次の手順に従います。
- 生統計ファイルの生成。簡単な方法は、元のファイル拡張子と呼ばれる一時ファイルにファイルサイズとファイル名を追加することです。したがって、ファイルサイズが3000000の場合、名前は一時ファイルの末尾に
/path/to/foo.mp3
追加されます。3000000 /path/to/foo.mp3
mp3
- 特定のイベントを処理する。ここでは、質問に提供したテストに基づいて一時ファイルを処理し、他の
m4a
2つのファイルを生成しますm4a_aac
。m4a_alac
- 出力生成。これで必要なすべての情報が利用可能になり、次のもののみが必要です。
- 各一時ファイルの行数を計算して、そのタイプのファイル数を決定します。
- そのタイプのファイル全体のサイズを取得するには、各サイズを追加します。
スクリプトは次のとおりです。
#!/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