Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

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:

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?

share|improve this question

marked as duplicate by Oli Jul 28 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 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. –  Jacob Vlijm Jul 28 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 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 –  Jacob Vlijm Jul 29 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 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)
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.
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 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])
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:

#!/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
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 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

    #!/bin/bash
    n=0
    for m in {00 .. 99}
    do
       mv track_$n.mp3 track_$m
       n=`expr $n + 1``
    done
    
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 at 8:24
    
you can check the updated answer. –  Dishank Jul 28 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 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 at 8:52

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