Den Befehl nur für bestimmte Dateien in Unterordnern ausführen, abhängig von anderen Dateien

452
bastianplettner

Ich habe einen Ordner namens Music mit Unterordnern verschiedener Interpreten, der eine ganze Reihe von .flac-Dateien enthält. Ich versuche, alle in das WAV-Dateiformat zu konvertieren und sie dann in Apple alac zu konvertieren, da die direkte Konvertierung nicht richtig funktioniert, aber der Haken ist, dass ich einige von ihnen zuvor konvertiert habe, aber nicht alle .

Mein Ordner sieht im Grunde so aus:

Music / ArtistX / Song1.flac

Musik / ArtistX / Song1.m4a

Musik / ArtistX / Song2.flac

Musik / ArtistY / Song1.flac

Musik / ArtistY / Song1.m4a

Im Grunde möchte ich einen Befehl, mit dem ich nur die .flac-Dateien konvertieren kann, die keine entsprechende .m4a-Datei neben sich haben. In der Vergangenheit habe ich einfach alle neu konvertiert, indem ich diese grobe for-Schleife ausgeführt habe:

for f in ./**/*.flac; do ffmpeg -i "$f" "$.wav"; done && for f in ./**/*.wav; do ffmpeg -n -i "$f" -acodec alac "$.m4a"; done && find . -type f -name '*.wav' -delete 

Dies ist jedoch für mein aktuelles Setup sehr ineffizient.

PS: Wenn es überhaupt möglich ist, würde ich es vorziehen, ffmpeg zu verwenden.

0
Hast du es mit find versucht? Versuchen Sie etwas wie "find. -Name '* .flac' -exec ffmp -i {}> {}. Wav \;" Könnte effizienter sein. Lewis M vor 6 Jahren 0
Das würde immer noch unerwünschte Konvertierungen in .wav für Dateien ausführen, die ich bereits vollständig in .m4a konvertiert habe bastianplettner vor 6 Jahren 0

1 Antwort auf die Frage

0
Frank Förster

Warum nicht einfach nach flac-Dateien suchen, nach vorhandenen m4a-Dateien suchen und konvertieren, wenn keine m4a-Datei vorhanden ist? Nur ein kleines Beispiel:

for i in $(find $PWD -name "*.flac") do # check if file was already converted and therefore a m4a file exists if [ ! -e $(dirname $)/$(basename $ .flac).m4a ] then # convert your file... File including path is in $ echo "Need to convert input file $ now..." WAV=$(dirname $)/$(basename $ .flac).wav M4A=$(dirname $)/$(basename $ .flac).m4a ffmpeg -i $ $ ffmpeg -n -i $ -acodec alac $ rm $ fi done 
Dies funktioniert nicht, weil ich Leerzeichen in meinen Datei- und Verzeichnisnamen habe. Der Befehl scheint die Variable $ nach jedem Leerzeichen aufzuteilen bastianplettner vor 6 Jahren 0