staging.inyokaproject.org

Befehl um Audio-Dateien zu konvertieren mittels find

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

UlfZibis

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3351

Hallo,

mit folgendem Befehl kann ich erfolgreich Bilddateien konvertieren, und sogar noch das Dateidatum retten:

find *.jpg -print -exec convert {} -quality 80% Comp/{} \; -exec touch -r {} Comp/{} \; 

Nun will ich das gleiche Prinzip für Audio-Dateien anwenden. Folgendes auf eine einzelne Datei angewandt funktioniert:

x="01 Waits, Tom - Underground.flac"
ffmpeg -i "$x" -q 2 "${x/.flac/.mp3}"
touch -r "$x" "${x/.flac/.mp3}" 

Doch folgendes funktioniert dann nicht mehr:

find *.flac -print -exec x="{}" \; -exec ffmpeg -i "$x" -q 2 "${x/.flac/.mp3}" \; -exec touch -r "$x" "${x/.flac/.mp3}" \; 

Noch nicht mal diese Vereinfachung:

$ find *.flac -print -exec x="{}" \; -exec echo "$x" \;
01 Waits, Tom - Underground.flac
find: ‘x=01 Waits, Tom - Underground.flac’: Datei oder Verzeichnis nicht gefunden
02 Waits, Tom - Shore Leave.flac
find: ‘x=02 Waits, Tom - Shore Leave.flac’: Datei oder Verzeichnis nicht gefunden
[.....]

Hat jemand eine Idee, wie ich zum Ziel komme?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

UlfZibis schrieb:

mit folgendem Befehl kann ich erfolgreich Bilddateien konvertieren, und sogar noch das Dateidatum retten:

find *.jpg -print -exec convert {} -quality 80% Comp/{} \; -exec touch -r {} Comp/{} \; 

Da brauchst Du keinen find - jedenfalls nicht so. Shell-Globbing reicht auch:

1
2
3
4
5
for f in *.jpg; do
  t="Comp/${f##/}"
  convert "$f" -quality 80% "$t"
  touch -r "$f" "$t"
done

Hat jemand eine Idee, wie ich zum Ziel komme?

Es liegt an der Ersetzung "${x/.flac/.mp3}", die so bei find nicht funktioniert. Nimm einfach meinen Ansatz von oben ohne find.

UlfZibis

(Themenstarter)

Anmeldungsdatum:
13. Juli 2011

Beiträge: 3351

rklm schrieb:

Da brauchst Du keinen find - jedenfalls nicht so. Shell-Globbing reicht auch:

Danke für den Ansatz, der könnte ja auch noch in einen Einzeiler passen, denn ich wollte eigentlich keine Skript-Datei benutzen. Folgendes funzt aber nicht (musste mit Str-C abbrechen):

$ for f in *.flac; do echo $f done;
> ^C

Was fehlt da, damit das auch in der Kommandozeile funktioniert?

Es liegt an der Ersetzung "${x/.flac/.mp3}", die so bei find nicht funktioniert.

Daran kann's eben nicht liegen, denn der Fehler taucht auch mit der gelb markierten Vereinfachung auf, wo diese Ersetzung nicht drin ist. Ich verstehe da nicht, warum find da auf einmal nach "x=...." suchen will.

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 450

UlfZibis schrieb:

Was fehlt da, damit das auch in der Kommandozeile funktioniert?

Syntax beachten! 😉

for f in *.flac; do echo $f; done

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: Zähle...

Ich würde $f auch in doppelte Anführungszeichen stecken.

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1303

UlfZibis schrieb:

Doch folgendes funktioniert dann nicht mehr:

find *.flac -print -exec x="{}" \; -exec ffmpeg -i "$x" -q 2 "${x/.flac/.mp3}" \; -exec touch -r "$x" "${x/.flac/.mp3}" \; 

Hat jemand eine Idee, wie ich zum Ziel komme?

Sorry für die späte Antwort, aber versuche mal folgenden Befehl:

$ # Hole eine Beispieldatei
$ wget -o /dev/null "https://filesamples.com/samples/audio/flac/Symphony%20No.6%20(1st%20movement).flac"
$ find *.flac -print -exec bash -c 'read x<<<"{}";ffmpeg -i "$x" -q 2 "${x/.flac/.mp3}" 2>/dev/null && touch -r "$x" "${x/.flac/.mp3}"' \;
Symphony No.6 (1st movement).flac
$ # Zeige das Ergebnis
$ ls -1sh Sy*
50M 'Symphony No.6 (1st movement).flac'
16M 'Symphony No.6 (1st movement).mp3'
$ 

Gegenüber dem einfachen Script hat der "find" Befehl halt den Vorteil, dass er recht schnell die Unterverzeichnisse durchsuchen kann.

Antworten |