How do I add zero padding to filenames that already have numbers in them?
Solution 1
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 commandseq 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 ofn
iterating through all numbers. So it doesmv track_1.mp3 track_01.mp3
,mv track_2.mp3 track_02.mp3
, until that last number which is 9.
Solution 2
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])
Solution 3
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
Solution 4
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
Solution 5
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.
Related videos on Youtube
![Questioner](https://i.stack.imgur.com/nzyQw.png?s=256&g=1)
Questioner
Updated on September 18, 2022Comments
-
Questioner almost 2 years
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?
-
Boris the Spider almost 10 yearsThis would seem to move
0
to00
then1
to00
then2
to00
and so forth. I don't think this is correct. -
Dishank Jindal almost 10 yearsyou can check the updated answer.
-
Boris the Spider almost 10 yearsFine, 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 movex
to0x
, rather than having two iterators. Finally you have a.mp3
missing. I think this answer is far from ideal. -
Dishank Jindal almost 10 yearsthe program is simple and will take care of all the files. And yes you are also right. i just trying to help.
-
Questioner almost 10 yearsThis is useful to know. Although, GPRename, seems to not acknowledge existing numbers, so it seems to not fix this particular situation.
-
Mona Jalal over 4 yearswhat 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