저는 매우 큰 음악 컬렉션을 정렬하는 스크립트를 작성하고 있습니다. 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
목표를 좀 더 다루기 쉬운 단계로 나누어야 합니다. 여기에는 두 가지 장점이 있습니다.
- 해결하기가 더 쉬울 것입니다.
- 생성된 코드는 더 깨끗해지고 재사용이 가능해집니다.
아래 스크립트는 기본적으로 다음 단계를 따릅니다.
- 원시 통계 파일 생성. 간단한 방법은 원래 파일 확장자로 명명된 임시 파일에 파일 크기와 파일 이름을 추가하는 것입니다. 따라서 파일 크기가 3000000이면 이름이 임시 파일 끝에
/path/to/foo.mp3
추가됩니다 .3000000 /path/to/foo.mp3
mp3
- 특정 사건을 처리하다. 여기서는 질문에 제공한 테스트를 기반으로 임시 파일을 처리
m4a
하고 다른 두 개의 파일을 생성합니다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