I have three .wav
files in my folder and I want to convert them into .mp3
with ffmpeg.
I wrote this bash script, but when I execute it, only the first one is converted to mp3.
What should I do to make script keep going through my files?
This is the script:
#!/bin/bash
find . -name '*.wav' | while read f; do
ffmpeg -i "$f" -ab 320k -ac 2 "${f%.*}.mp3"
done
Use the -nostdin
flag to disable interactive mode,
ffmpeg -nostdin -i "$f" -ab 320k -ac 2 "${f%.*}.mp3"
or have ffmpeg
read its input from the controlling terminal instead of stdin.
ffmpeg -i "$f" -ab 320k -ac 2 "${f%.*}.mp3" </dev/tty
See the -stdin
/-nostdin
flags in the ffmpeg documentation, as well as the FAQ How do I run ffmpeg as a background task?.
If you do need find
(for looking in subdirectories or performing more advanced filtering), try this:
find ./ -name "*.wav" -exec sh -c 'ffmpeg -i "$1" -ab 320k -ac 2 "$(basename "$1" wav).mp3"' _ {} \;
Piping the output of find
to the while
loop has two drawbacks:
ffmpeg
, for some reason unknown to me, will read from standard input, which interferes with the read
command. This is easy to fix, by simply redirecting standard input from /dev/null
, i.e. find ... | while read f; do ffmpeg ... < /dev/null; done
.In any case, don't store commands in variable names and evaluate them using eval
. It's dangerous and a bad habit to get into. Use a shell function if you really need to factor out the actual command line.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With