LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Slackware (https://www.linuxquestions.org/questions/slackware-14/)
-   -   need a bash script to batch convert .wav to .mp3 (https://www.linuxquestions.org/questions/slackware-14/need-a-bash-script-to-batch-convert-wav-to-mp3-555911/)

nass 05-22-2007 06:58 PM

need a bash script to batch convert .wav to .mp3
 
hello everybody,
i take it there is no bash subforum so ill just right here.

i have installed the lame encoder, and i wanna write a bash script that reads the contents of a given folder, and runs a command for each file in it.. so basically batch process wav to mp3 conversion.

the files will obviously be *.wav files, the output should be the same file names with .mp3 instead of .wav, and the command is 'lame' along with some options....

i know little of bash in order to carry that out and im hoping that i will start understanding a few things once i see how this hopefully simple script works...

anyone has any idea/ has done it ?
nass

Matir 05-22-2007 07:13 PM

I'd do something like this:
Code:

#!/bin/bash
LAMEOPTS="-S"

for FILE in *.wav ; do
    OUTNAME=`basename "$FILE" .wav`.mp3
    lame $LAMEOPTS "$FILE" "$OUTNAME"
done


nass 05-22-2007 08:12 PM

working on the aforementioned problem, the first thing to do is to actually me able to 'read' the filenames into lame
(lame works as: lame [OPTIONS] <input file> <output file>)

so i was thinking to use
Code:

ls | grep '\(.*\.\)wav.*'
to feed the output of ls (some .wav files) into grep that then looks for:
- any text (ie the filename) followed by
- a dot followed by
- the extension 'wav' followed by
- any other text that might be there after, or nothing..

the parenthesis: \( \) are there to save the matched filename followed by the dot, so as to be used with the extension mp3 later on.

im supposed to use \1 to address the filename (the matched expression in the parenthesis) but i haven't figured that out far yet. and at any rate i am not sure how i will concatenate this \1 with the word 'mp3'..

so i hope i got this right so far.. if you know of another way or can help in this way please do so:)

nass

Matir 05-22-2007 08:23 PM

Did you test my script? In my opinion, it is the most straightforward way. I'm not aware of any way to use grep for string replacement.

nass 05-22-2007 08:44 PM

i was typing while you replied:) had i known of your script, i wouldn't even have bothered trying the much more complex grep /sed way... if there is any that is

i tested the script and it works fine... thank you very much!
i will try to make a script so as to allow arguments to be input when calling it.


just out of curiosity though i've reached this far:

lame -m j -h -V 3 --vbr-new `grep '.*\.wav'<list` `sed s/wav/mp3/g<list`

lame [ OPTIONS ]< input file list >< output file list >

list is a temporary file created as ls > list

the thing is now lame exits saying 'excess arguments'... could it be that the whole list is dumped at once both from grep and from sed instead of one file at a time? - i think it is..
is there a way to serialize that ?

thnk you once again for your help
nass

rickh 05-22-2007 08:48 PM

Quote:

`basename "$FILE" .wav`.mp3
Hey! That's a great little addition. This question, has obviously been asked and answered many times, but that's the first time I've seen that included.

Could that also be..... $(basename "$FILE" .wav).mp3 ?

dive 05-22-2007 08:51 PM

First make your list. Then

Code:

for i in `cat list`
do
lame -m j -h -V 3 --vbr-new "$i"
done

or thereabouts

Matir 05-22-2007 09:01 PM

Quote:

Originally Posted by rickh
Hey! That's a great little addition. This question, has obviously been asked and answered many times, but that's the first time I've seen that included.

Could that also be..... $(basename "$FILE" .wav).mp3 ?

Yes, it could be. I guess I'm just a backtick kinda guy, though $( ) reads better and allows for nesting.

Matir 05-22-2007 09:05 PM

Quote:

Originally Posted by dive
First make your list. Then

Code:

for i in `cat list`
do
lame -m j -h -V 3 --vbr-new "$i"
done

or thereabouts

Careful with 'cat list'.... This will split oddly on whitespace. You might need to add quotes in some manner.

nass 05-22-2007 09:25 PM

ok so the script now looks like

Code:

#!/bin/bash
LAMEOPTS=""

if [ "$#" -gt 0 ]; then
  LAMEOPTS="$*"
else
  LAMEOPTS="-m j -h -V 3 --vbr-new"
  echo "no arguments. Assuming: $LAMEOPTS ."
fi

for FILE in $PWD/*.wav ; do
    OUTNAME=`basename "$FILE" .wav`.mp3
    lame $LAMEOPTS "$FILE" "$OUTNAME"
done
~

in order to account for options that the user may prefer to set.
i also placed the script in /usr/bin so everyone can access it
and i added the $PWD so as to be usable anywhere on the filesystem.

problem is that in a folder name has spaces PWD returns an incomplete path

so if , say, the path is /mnt/hd/my\ stuff
echo $PWD will return /mnt/hd/my
which is not a valid directory.... how can i overcome this?

Matir 05-22-2007 09:38 PM

You should not need the $PWD. It will act on the current working directory as-is.

H_TeXMeX_H 05-22-2007 09:40 PM

Well, $PWD should not return an incomplete path as long as you put it in quotes like:

Code:

"$PWD"

nass 05-23-2007 06:35 AM

quite right, i remove the $PWD and it works like a charm.
thank you very much

titopoquito 05-23-2007 08:13 AM

Quote:

Originally Posted by rickh
Hey! That's a great little addition. This question, has obviously been asked and answered many times, but that's the first time I've seen that included.

Could that also be..... $(basename "$FILE" .wav).mp3 ?

You can also use bash to do this, for example "${FILE//.wav/.mp3}" or "${FILE%%.wav}.mp3". Even more nice ways to do that :)

If you like to dig deeper, I saw this first few days ago in a great article on bash parameters: http://www-128.ibm.com/developerwork...BashParameters

Matir 05-23-2007 12:36 PM

Wouldn't be Linux if there weren't 5 ways to get the same thing done. :)


All times are GMT -5. The time now is 05:05 PM.