Sign up ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free.

This question already has an answer here:

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:


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:


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?

share|improve this question

marked as duplicate by Oli Jul 28 '14 at 14:11

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

My answer on the duplicate should answer this pretty completely in a single command. –  Oli Jul 28 '14 at 14:13
@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. –  Jacob Vlijm Jul 28 '14 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 '14 at 23:51
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 –  Jacob Vlijm Jul 29 '14 at 18:35
@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 '14 at 15:31

5 Answers 5

up vote 7 down vote accepted

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)
    mv track_$n.mp3 track_0$n.mp3
  • 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.
share|improve this answer

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 and run it by the command:

python3 /path/to/

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])
share|improve this answer

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:



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`
echo $newname

The loop:


for item in track_1.mp3 track_10.mp3 track_11.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`
    echo "Renaming $item -> $newname"
    mv $item $newname
enter code here
share|improve this answer

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.

share|improve this answer
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 '14 at 9:10

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

    for m in {00 .. 99}
       mv track_$n.mp3 track_$m
       n=`expr $n + 1``
share|improve this answer
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. –  Boris the Spider Jul 28 '14 at 8:24
you can check the updated answer. –  Dishank Jul 28 '14 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. –  Boris the Spider Jul 28 '14 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. –  Dishank Jul 28 '14 at 8:52

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