9

I used Sound Juicer to rip a CD of audio for a language learning book so that I could listen to them on my Android. However, Sound Juicer seems to only have the option of numbering files without leading zeros. Like this:

track_1.mp3
track_10.mp3
track_11.mp3

This leads to some confused ordering on my music player. So, I want to add some zeros to the name, so that they're ordered properly, like this:

track_01.mp3
track_02.mp3
track_03.mp3

How do I accomplish this? I tried using GPRename, but while it has the ability to add numbers, it doesn't seem to have any options for adding leading zeros.

Is there a better program or something I can do at the command line?

9
  • My answer on the duplicate should answer this pretty completely in a single command.
    – Oli
    Jul 28, 2014 at 14:13
  • 1
    @Oli, although your answer works here too, the question actually is different, and other answers there do not necessarily work here, because of the preceding track_ string. Mine needed editing anyway to make it work on this question. Jul 28, 2014 at 15:58
  • @Oli, Jacob is correct. I had looked at similar solutions to the question you've linked to, but because of the particular naming scheme I was dealing with, it wasn't obvious that any file numbering solution would work. Marking this as duplicate is presuming a level of knowledge that precludes the purpose of asking questions.
    – Questioner
    Jul 28, 2014 at 23:51
  • 1
    also @muru, the fact that you can produce an answer that works on more than one question does not make the questions equal. See my reaction on meta meta.askubuntu.com/questions/11622/are-these-duplicates Jul 29, 2014 at 18:35
  • 1
    @muru Off-topic to the duplication issue, that line would munch the extension. There is certainly a way similar to that which would work though.
    – Oli
    Jul 30, 2014 at 15:31

5 Answers 5

10

I'm assuming that you just need to rename the files 1-9, since those are the ones that need padding. There are multiple ways of doing this.

You can execute the below command:

for n in $(seq 9); do mv track_$n.mp3 track_0$n.mp3; done;

This will rename tracks track_1.mp3 - track_9.mp3 to track_01.mp3 - track_09.mp3.


To break it down, it looks like this:

for n in $(seq 9)
do
    mv track_$n.mp3 track_0$n.mp3
done
  • for n in $(seq 9): for every number in the output of the command seq 9, which is a command that just lists numbers 1 to 9, do,
  • mv track_$n.mp3 track_0$n.mp3: this is the actual command that renames the files. It substitutes the value of n iterating through all numbers. So it does mv track_1.mp3 track_01.mp3, mv track_2.mp3 track_02.mp3, until that last number which is 9.
1
  • what should I do if not all images exist like .JPEG doesn't exist or 99.JPEG or 110.JPEG ? $ for n in $(seq 9); do mv $n.JPEG 0$n.JPEG; done; mv: cannot stat ‘1.JPEG’: No such file or directory
    – Mona Jalal
    Nov 10, 2019 at 18:14
4

The script below wil rename files is given directory. It calculates the number of leading zeros needed, no matter the number of files (if >100, more zeros are needed), and renames the files automatically.

To use it

copy the script below into an empty file, in the headsection, set the sourcedirectory, the prefix ("track-" in this case) and the file extension of the files you want to rename. Save it as rename.py and run it by the command:

python3 /path/to/script.py

The script:

#!/usr/bin/env python3

import shutil
import os

sourcedir = "/path/to/sourcedir"
prefix = "track_"
extension = "mp3"

files = [(f, f[f.rfind("."):], f[:f.rfind(".")].replace(prefix, "")) for f in os.listdir(sourcedir) if f.endswith(extension)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen - len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+prefix+str(zeros*"0"+item[2])+item[1])
1

Of course there are many ways of doing it. You can, for instance:

  • Separate the parts
  • pad the part that has the number
  • concatenate the individual part back to the new name

Put this into a loop:

#!/bin/bash

item="track_1.mp3"

part1=`echo $item | awk -F_ '{print $1}'`
part2=`echo $item | awk -F_ '{print $2}'`
part2a=`echo $part2 | awk -F. '{print $1}'`
part2b=`echo $part2 | awk -F. '{print $2}'`
number=`printf "%02d" $part2a`
seperator="_"
newname="$part1$seperator$number.$part2b"
echo $newname

The loop:

#!/bin/bash

for item in track_1.mp3 track_10.mp3 track_11.mp3
do
    part1=`echo $item | awk -F_ '{print $1}'`
    part2=`echo $item | awk -F_ '{print $2}'`
    part2a=`echo $part2 | awk -F. '{print $1}'`
    part2b=`echo $part2 | awk -F. '{print $2}'`
    number=`printf "%02d" $part2a`
    seperator="_"
    newname="$part1$seperator$number.$part2b"
    echo "Renaming $item -> $newname"
    mv $item $newname
done
enter code here
1

GPRename will automatically insert a zero if you are renaming 10 or more files (two if you are renaming 100 or more, etc.) when using the numerical function. Just make sure Zero auto-fill is turned on in the Options menu.

1
  • This is useful to know. Although, GPRename, seems to not acknowledge existing numbers, so it seems to not fix this particular situation.
    – Questioner
    Jul 28, 2014 at 9:10
1

Make a script that will work like a command.

Make this file on the directory where you track file exist.

  • Do like this

    touch change
    chmod +x change
    vim change
    
  • In it write

    #!/bin/bash
    n=0
    for m in {00 .. 99}
    do
       mv track_$n.mp3 track_$m
       n=`expr $n + 1``
    done
    
4
  • This would seem to move 0 to 00 then 1 to 00 then 2 to 00 and so forth. I don't think this is correct. Jul 28, 2014 at 8:24
  • you can check the updated answer. Jul 28, 2014 at 8:43
  • Fine, it should now produce the right outcome. But it should be obvious that you don't need to move anything higher than 9 as it will already have two digits. It should also be obvious that you only need to move x to 0x, rather than having two iterators. Finally you have a .mp3 missing. I think this answer is far from ideal. Jul 28, 2014 at 8:49
  • the program is simple and will take care of all the files. And yes you are also right. i just trying to help. Jul 28, 2014 at 8:52

Not the answer you're looking for? Browse other questions tagged .