Geralmente é útil ter arquivos em ordem de classificação quando você deseja compará-los. O -u
torna cada linha na saída única removendo quaisquer duplicatas.
sort -u file1 > file1.sorted
sort -u file2 > file2.sorted
comm
pode comparar arquivos classificados, mas só pode comparar texto literal. Então, isso reduzirá o problema, mas só poderá filtrar as correspondências exatas. -1
remove linhas exclusivas do primeiro arquivo e -3
remove linhas comuns a ambos os argumentos do arquivo. Isso nos deixa com linhas que são exclusivas para o segundo arquivo.
comm -1 -3 file1.sorted file2.sorted > file2.reduced
Agora, precisamos fazer o trabalho complicado apenas para esse (espero) arquivo menor.
sed 's#^\./##' file2.reduced | while read line; do
artist_album=${line%/*}
filename=${line##*/}
title=$(echo "$filename" | sed 's/^[0-9]\{1,3\}\. //;t;s/^[0-9]\{1,3\} - [0-9]\{1,3\} - //;t;s/^[0-9]\{1,3\} - //')
extension=${title##*.}
title=${title%.$extension}
# We use fixed strings in case there are special chars in the file name
# If the file names are "regex-save" we can use one grep instead:
# ! grep -q -E "^\./$artist_album/.*$title\.(mp3|flac)\$" file1.sorted
if ! grep -F "./$artist_album/" file1.sorted | grep -F -e "$title." | grep -q -E '(mp3|flac)$'; then
echo "./$line"
fi
done > results