LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Software (https://www.linuxquestions.org/questions/linux-software-2/)
-   -   Combining a directory of mp3 files into one file in order. (https://www.linuxquestions.org/questions/linux-software-2/combining-a-directory-of-mp3-files-into-one-file-in-order-4175585292/)

yknivag 07-22-2016 08:30 AM

Combining a directory of mp3 files into one file in order.
 
I have a series of directories containing multiple mp3 files with filenames 001.mp3, 002.mp3, ..., 030.mp3.

What I want to do is to put them all together in order into a single mp3 file and add some meta data to that.

Here's what I have at the moment (removed some variable definitions, for clarity):

Code:

#!/bin/bash
for d in */; do
    cd $d
    find . -iname '*.mp3' -exec lame --decode '{}' - ';' | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3
    cd ..
done

Sometimes this works and I get a single file with all the "tracks" in the correct order.

However, more often than not I get a single file with all the "tracks" in reverse order, which really isn't good.

What I can't understand is why the order varies between different runs of the script as all the directories contain the same set of filenames. I've poured over the man page and can't find a sort option for find.

Is there any way I can put a sort in before find runs the exec? I can find plenty of examples here and elsewhere of doing this with -exec ls but not where one needs to execute something more complicated with exec.

Pushing the boundaries of my own bash abilities here but could I do something like this?
Code:

find . -iname '*.mp3' | sort -n | xargs <something_here>
If so how would I re-arrange the lame command to take an input?

unSpawn 07-23-2016 03:11 AM

Quote:

Originally Posted by yknivag (Post 5579833)
could I do something like this?
Code:

find . -iname '*.mp3' | sort -n | lame

Absolutely! (Note absence of 'xargs'.)
Fun part is you can test the change yourself:

Code:

#!/bin/bash
set -vx
for d in */; do
    cd $d
    find . -type f -iname '*.mp3' | sort -n | while read MP3; do echo "lame --decode "${MP3}" | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3"
    cd ..
done

(Two methods shown in bold: using "set" and "echo".)

yknivag 08-19-2016 08:28 AM

The final solution turned out to be rather neat in the end:

Code:

find . -iname '*.mp3' -print0 | sort -zn | xargs -0 -I '{}' lame --decode '{}' - | lame --tt "$title_prefix$name" --ty "${name:5}" --ta "$artist" --tl "$album" -b 64 - $final_path"${d%/}".mp3


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