모든 오디오 파일을 찾고, 계산하고, 정렬하세요. 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

하지만 파일 이름 목록 대신 총 파일 수와 크기를 가져와서 모두 하나의 스크립트로 결합하는 방법을 모르겠습니다.

기본적으로 다음을 출력하고 싶습니다.

  • 파일 형식 목록
  • 파일 유형별 파일 수
  • 파일 형식별 총 크기
  • M4A AAC 전체 및 전체 크기
  • M4A ALAC 총 개수 및 총 크기

얼마나 잘 작동하는지에 따라 출력에 따라 파일을 디렉터리로 정렬하는 데 사용하는 것을 고려할 수 있습니다.

답변1

목표를 좀 더 다루기 쉬운 단계로 나누어야 합니다. 여기에는 두 가지 장점이 있습니다.

  • 해결하기가 더 쉬울 것입니다.
  • 생성된 코드는 더 깨끗해지고 재사용이 가능해집니다.

아래 스크립트는 기본적으로 다음 단계를 따릅니다.

  1. 원시 통계 파일 생성. 간단한 방법은 원래 파일 확장자로 명명된 임시 파일에 파일 크기와 파일 이름을 추가하는 것입니다. 따라서 파일 크기가 3000000이면 이름이 임시 파일 끝에 /path/to/foo.mp3추가됩니다 .3000000 /path/to/foo.mp3mp3
  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"
# 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

관련 정보