Slackware This Forum is for the discussion of Slackware Linux.
|
| Notices |
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
 |
GNU/Linux Basic Guide
This 255-page guide will provide you with the keys to understand the philosophy of free software, teach you how to use and handle it, and give you the tools required to move easily in the world of GNU/Linux. Many users and administrators will be taking their first steps with this GNU/Linux Basic guide and it will show you how to approach and solve the problems you encounter.
Click Here to receive this Complete Guide absolutely free. |
|
 |
|
05-22-2007, 06:58 PM
|
#1
|
|
Member
Registered: Apr 2006
Location: Athens, Greece
Distribution: slack(64|32)_v(13.37|14.0), debian6, ubuntu
Posts: 622
Rep:
|
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
|
|
|
|
05-22-2007, 07:13 PM
|
#2
|
|
Moderator
Registered: Nov 2004
Location: San Jose, CA
Distribution: Ubuntu
Posts: 8,505
Rep: 
|
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
|
|
|
|
05-22-2007, 08:12 PM
|
#3
|
|
Member
Registered: Apr 2006
Location: Athens, Greece
Distribution: slack(64|32)_v(13.37|14.0), debian6, ubuntu
Posts: 622
Original Poster
Rep:
|
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
|
|
|
|
05-22-2007, 08:23 PM
|
#4
|
|
Moderator
Registered: Nov 2004
Location: San Jose, CA
Distribution: Ubuntu
Posts: 8,505
Rep: 
|
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.
|
|
|
|
05-22-2007, 08:44 PM
|
#5
|
|
Member
Registered: Apr 2006
Location: Athens, Greece
Distribution: slack(64|32)_v(13.37|14.0), debian6, ubuntu
Posts: 622
Original Poster
Rep:
|
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
|
|
|
|
05-22-2007, 08:48 PM
|
#6
|
|
Senior Member
Registered: May 2004
Location: Albuquerque, NM USA
Distribution: Debian-Lenny/Sid 32/64 Desktop: Generic AMD64-EVGA 680i Laptop: Generic Intel SIS-AC97
Posts: 4,250
Rep:
|
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 ?
Last edited by rickh; 05-22-2007 at 08:58 PM.
|
|
|
|
05-22-2007, 08:51 PM
|
#7
|
|
Senior Member
Registered: Aug 2003
Location: UK
Distribution: Slackware
Posts: 3,084
|
First make your list. Then
Code:
for i in `cat list`
do
lame -m j -h -V 3 --vbr-new "$i"
done
or thereabouts
|
|
|
|
05-22-2007, 09:01 PM
|
#8
|
|
Moderator
Registered: Nov 2004
Location: San Jose, CA
Distribution: Ubuntu
Posts: 8,505
Rep: 
|
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.
|
|
|
|
05-22-2007, 09:05 PM
|
#9
|
|
Moderator
Registered: Nov 2004
Location: San Jose, CA
Distribution: Ubuntu
Posts: 8,505
Rep: 
|
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.
|
|
|
|
05-22-2007, 09:25 PM
|
#10
|
|
Member
Registered: Apr 2006
Location: Athens, Greece
Distribution: slack(64|32)_v(13.37|14.0), debian6, ubuntu
Posts: 622
Original Poster
Rep:
|
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?
|
|
|
|
05-22-2007, 09:38 PM
|
#11
|
|
Moderator
Registered: Nov 2004
Location: San Jose, CA
Distribution: Ubuntu
Posts: 8,505
Rep: 
|
You should not need the $PWD. It will act on the current working directory as-is.
|
|
|
|
05-22-2007, 09:40 PM
|
#12
|
|
Guru
Registered: Oct 2005
Location: $RANDOM
Distribution: slackware64
Posts: 12,706
|
Well, $PWD should not return an incomplete path as long as you put it in quotes like:
|
|
|
|
05-23-2007, 06:35 AM
|
#13
|
|
Member
Registered: Apr 2006
Location: Athens, Greece
Distribution: slack(64|32)_v(13.37|14.0), debian6, ubuntu
Posts: 622
Original Poster
Rep:
|
quite right, i remove the $PWD and it works like a charm.
thank you very much
|
|
|
|
05-23-2007, 08:13 AM
|
#14
|
|
Senior Member
Registered: Jul 2004
Location: Ruhr Area, Germany
Distribution: Slackware 14.0
Posts: 1,476
Rep:
|
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
|
|
|
|
05-23-2007, 12:36 PM
|
#15
|
|
Moderator
Registered: Nov 2004
Location: San Jose, CA
Distribution: Ubuntu
Posts: 8,505
Rep: 
|
Wouldn't be Linux if there weren't 5 ways to get the same thing done. 
|
|
|
|
| Thread Tools |
Search this Thread |
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -5. The time now is 01:31 AM.
|
|
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.
|
Latest Threads
LQ News
|
|