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?

guntbert
  • 13,134
Questioner
  • 6,839
  • My answer on the duplicate should answer this pretty completely in a single command. – Oli Jul 28 '14 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 '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
  • The question is exactly the same, the input data is slightly different (which can either be ignored or easily adjusted for). When I'm back from holiday I'll spell out the flexibility of the rename method and expand the question for prefixed options. – Oli Jul 29 '14 at 08:00
  • I agree with Oli. rename in Ubuntu is the Perl-based one, and can do anything Perl can, and so is sufficiently powerful to handle such changes in input. rename -n 'my ($first,$second)=split("_");$_=join("_", $first, sprintf("%02d",$second))' * can do that, and I think simpler ways would exist in Perl. Since the question is closed, I can't add an answer. – muru Jul 29 '14 at 08:35
  • 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 http://meta.askubuntu.com/questions/11622/are-these-duplicates – Jacob Vlijm Jul 29 '14 at 18:35
  • @Oli, I think there may also be a conflict of interest here. If you weren't advocating for your own answer to take precedence, it would be easier to belive this was an objective determination. – Questioner Jul 30 '14 at 12:00
  • @DaveMG I've explained the technical reasoning behind the closure on Jacob's Meta Q. That I have an answer on the master is just gravy. – Oli Jul 30 '14 at 15:28
  • 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 '14 at 15:31

5 Answers5

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.
Alaa Ali
  • 31,535
  • 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 '19 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])
muru
  • 197,895
  • 55
  • 485
  • 740
Jacob Vlijm
  • 83,767
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
L. D. James
  • 25,036
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
    
Doorknob
  • 378
  • 7
  • 18
  • 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 08:24
  • you can check the updated answer. – Dishank Jindal Jul 28 '14 at 08: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 08: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 Jindal Jul 28 '14 at 08:52
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.

Fern Moss
  • 8,785
  • 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 09:10