Doppelte Dateiennamen mit unterschiedlichen Extensions finden

geposted am 19.06.2020, in Bash

z.B. um herauszufinden, ob Musikdateien in mehreren Formaten herumliegen:

find Musik/ -regex '.*\.\(flac\|mp3\)' -type f | sed "s/\.\(flac\|mp3\)//g" | sort | uniq --repeated

Das funktioniert aber nur für Dateien im gleichen Verzeichnis.

Besser ist (auch weil Extensions in Groß- UND Kleinschreibung gefunden werden):

find Musik/ -type f -iname "*.mp3" -o -iname "*.flac" -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated

Jetzt bekommt man aber nur eine Liste mit den Namen ohne Extensions, so weiß man natürlich nicht, wo die tatsächlich liegen.

Will man das Ergebnis noch an locate übergeben und das Ergebnis formatieren, wirds kompliziert. Das Ergebnis können Dateinamen mit Whitespace sein, darum ist eine for-Schleife ungeeignet, die Whitespace als Trenner versteht, while dagegen liest bis zum Ende einer Zeile.

while read i;do echo -e "\nRESULTS FOR $i" && printf "=%.0s" {1..55} && echo && locate -r "$i\.\(mp3\|flac\)" ; done <<< $(find Musik/ -type f -iname "*.mp3" -o -iname "*.flac"  -exec bash -c 'basename "$0" ".${0##*.}"' {} \; | sort | uniq --repeated)

locate findet natürlich alles, nicht nur im Musik-Folder, das macht aber nichts. Man könnte locate jetzt noch mit einem 2. find-Aufruf ersetzen. Aber mir reicht das so.

Das Ergebnis sieht dann z.B. so aus:

RESULTS FOR 02 - People
=======================================================
/home/hli/Musik/GRANT GREEN/Grant Green - Talkin About/02 - People.flac
/home/hli/Musik/WES MONTGOMERY/Wes Montgomery - Movin' Wes/02 - People.flac

RESULTS FOR 12 - Get Back
=======================================================
/home/hli/Musik/ROCK AND POP/The BEATLES/Let It Be/12 - Get Back.mp3
/home/hli/Musik/ROCK AND POP/The Beatles - Let It Be (1970) [FLAC] (Remastered 1990)/12 - Get Back.flac
/home/hli/Musik/ROCK AND POP/The Beatles Stereo 2009 Remasters/The Beatles - 2009 - Let It Be (2009 Stereo Remaster) [FLAC]/12 - Get Back.flac