I want to convert all *.flac to *.mp3 in the specific folder.

This is what I've tried, but not works:

# change to the home directory
cd ~/music
# convert all *.flac files
ffmpeg -i *.flac -acodec libmp3lame *.mp3
# (optional: check whether there are any errors printed on the terminal)
sleep 60

How to get my goal?

share|improve this question
2  
did you try "FOR LOOP"? – Danila Ladner Feb 12 '14 at 15:57
    
@DanilaLadner Not yet. Thanks for the clue. – Kevin Dong Feb 12 '14 at 15:58
    
I wrote a script that does this, in parallel, and copies the tags over: http://tuxhelp.org/#flac-distiller – user136310 Sep 29 '15 at 19:38
    
Sorry I forget it. After convert file name become file.avi.mp3 you can use : rename "s/.avi//g" *.avi.mp3 for remove .avi. – user149335 Dec 29 '15 at 19:47
up vote 27 down vote accepted

Try this:

for i in *.flac ; do 
    ffmpeg -i "$i" -acodec libmp3lame $(basename "${i/.flac}").mp3 
    sleep 60 
done
share|improve this answer
1  
It isn't working with files containing space. How can I modify $(basename "${i/.flac}") to handle spaces? – ppr Jan 3 '16 at 15:39
1  
@ppr Try putting this line just before the for loop: IFS=$'\n' – Ketan Jan 3 '16 at 19:14
1  
I solved the space issue by changing $(basename "${i/.flac}").mp3 to "$(basename "${i/.flac}").mp3" (putting quotes around it) – MalcolmOcean Sep 17 '16 at 20:02

A simple 1 liner solution: find -name "*.flac" -exec ffmpeg -i {} -acodec libmp3lame -ab 128k {}.mp3 \;

http://lewisdiamond.blogspot.ca/2012/01/converting-flac-to-mp3.html

Note that this will be applied recursively in the given directory. I.e. if you run this from your Music folder, it will convert all flacs from subfolders and produce a .mp3 next to it. You may also do it without ffmpeg by directly using flac and lame (i.e. read w/ flac, pipe to lame, output to a file .mp3), as shown in the link.

share|improve this answer
    
You can use -maxdepth 1 I think like in X Tian's answer to limit the recursiveness. – のbるしtyぱんky Oct 24 '14 at 20:00
2  
Yes you can. You could also use ls piped to xargs or a for loop. I'm just making the (possibly wrong) assumption that a recursive search is more along what the OP needed (i.e. change all the .flac from my music library). – Lewis Diamond Oct 24 '14 at 20:48
9  
This command is great - however; You end up with files named *.flac.mp3. Using your command, I came up with this... find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 128k "${0/.flac}.mp3"' {} \; – Shane Oct 27 '15 at 2:54
1  
Yes, as I explained in the blog, I like this aspect of adding the .mp3 because it tells me this files comes from a lossless source, which should be found somewhere on my hard drive. – Lewis Diamond Oct 28 '15 at 16:23

If you have some white spaces in the file names:

for a in *.flac; do
  f="${a[@]/%flac/mp3}"
  ffmpeg -i "$a" -qscale:a 0 "$f"
done
share|improve this answer

I worked on @Ketan's answer using avconv, since ffmpeg doesn't work well over here.

for i in *.flac ; do 
    avconv -i "$i" "./mp3/$i".mp3
done

This converts flac files in a folder into mp3 files and moves then to an existing "mp3" folder. Files will be named in the model "original_name.flac.mp3"

share|improve this answer

Parallel FTW (no doubt you have more than one core - why not use them?):

ls *flac | while read f; do ffmpeg -i "$f" -acodec libmp3lame $f.mp3 & done
share|improve this answer
find . -maxdepth 1 -type f -name '*.flac' | while IFS= read -r f; do
  ffmpeg -i  "$f" -acodec libmp3lame "$( sed -e's/\.flac/.mp3/g' <<< $f )"
done
share|improve this answer
1  
sed expression needs an ending ' – Jaime M. Aug 14 '15 at 16:15

For example, if you have multiple avi files:

ls *.avi | xargs -I {} ffmpeg -i {} {}.mp3
share|improve this answer

If it can help .... I've written a small bash script to do this .... You need to have ffmpeg / flac installed.

How it works:

It takes 2 arguments :

  1. The folder of your music library (flac/ogg/mp3 ...)
  2. The destination folder (you need to create it before).

It produce :

  • An exact copy from the source folder into the destination folder, with:
    • the non flac files copied into.
    • the flac files transformed to mp3 ( VBR high quality)
  • A run.sh file with the commands to convert the flac files (this script is executed automatically).

#!/bin/bash

FLAC_PATH=$1
CONV_PATH=$2

DEBUG=0;

function usage {
  echo "";
  echo "    This script convert all flac files from a folder to mp3 files to a second folder";
  echo "";
  echo "    Usage :";
  echo "        ./conv.sh {Source Folder} {Destination Folder}";
  echo "        note : booth folder must exist before starting this script";
  echo "               files other than flac are copied to the destination folder";
  echo "";
}

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

if [ ! -d "$2" ]; then
  echo "";
  echo " ERROR : [$2] is not a directory.";
  usage
  exit 1
fi;

COMMANDS="run.sh"
echo "" > run.sh
echo " convert from $FLAC_PATH to $CONV_PATH ";

find "${FLAC_PATH}" -type f |while read myFile; do
  SRC_DIR=${myFile%/*}
  SRC_FILE=${myFile##*/}
  DST_DIR=$CONV_PATH/$SRC_DIR
  mkdir -p "${DST_DIR}"
  # TEST if the file is a flac ....
  metaflac --show-md5sum "${myFile}" 2>/dev/null 1>/dev/null
  if [ $? -eq 0 ]; then
    echo -n "  *** $myFile [FLAC !] : "
    DST_FILE=${myFile%.*}
    OUT_PATH="${DST_DIR}/$( echo $SRC_FILE | sed -e 's/.flac$/.mp3/')"

    if [ $DEBUG == 1 ]; then
      echo "  SRC = $myFile";
      echo "  OUT = $OUT_PATH"
    fi;

    if [ -f "$OUT_PATH" ]; then
      echo "  exist, do nothing !";
    else
      echo "  add to compress list !";
      echo "ffmpeg -y -i \"${myFile}\" -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 \"${OUT_PATH}\" " >> $COMMANDS
    fi;

  else
     echo -n "  *** $SRC_FILE  [NOT FLAC] : "
     if [ -f "${CONV_PATH}/${myFile}" ]; then
       echo " exist, do nothing !"
     else
       echo "  copy."
       cp "${myFile}" "${CONV_PATH}/${myFile}"
     fi
  fi

done;

echo " And now, CONVERT THE FLAC's!!! "
sh run.sh

share|improve this answer

for a in *.flac

do OUTF=echo "$a" | sed s/\.flac$/.mp3/g

ffmpeg -i "$a" -acodec libmp3lame "$OUTF"

done

share|improve this answer
1  
welcome to U&L, your answer hardly add anything to @Ketan accepted answer four years ago. – Archemar Dec 29 '17 at 8:45

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.