This is a beautiful problem because it covers so many things you need to know about bash.
Notice that you are using zero padded numbers. This is what makes the problem so devious! You need to have an integer variable inside a loop to keep count on which number to add, but bash goobles up leading zeros in a variable. To make things even more fun, the number of leading zeros varies from none to three.
Let's create a function to do just this part.
Code:
ascii_num ()
{
picnum='000'$1;
picnum=${picnum:$((-4)):4}
}
Call it like "picnum 10" to produce a variable with the value of "0010".
Now we are ready for the program:
Code:
> ls
11554.jpeg 14145.jpeg 15533.jpeg 17242.jpeg 20854.jpeg 21366.jpeg 22942.jpeg 2515.jpeg 27809.jpeg 30845.jpeg 3837.jpeg 6197.jpeg 8632.jpeg
1159.jpeg 14340.jpeg 15742.jpeg 17722.jpeg 20881.jpeg 21866.jpeg 23037.jpeg 25293.jpeg 29139.jpeg 31336.jpeg 4900.jpeg 62.jpeg test.sh
13536.jpeg 14385.jpeg 16307.jpeg 18214.jpeg 208.jpeg 22734.jpeg 24374.jpeg 25547.jpeg 29264.jpeg 31690.jpeg 6118.jpeg 7824.jpeg test.tar
14142.jpeg 14879.jpeg 16814.jpeg 19786.jpeg 21262.jpeg 22845.jpeg 2453.jpeg 27406.jpeg 30704.jpeg 32360.jpeg 611.jpeg 8051.jpeg
jschiwal@hpmedia:~/test/testdir> cat test.sh
ascii_num ()
{
picnum='000'$1;
picnum=${picnum:$((-4)):4}
}
# set the index to 0 initially
declare -i num=0
# rename each jpeg file to Image####.jpeg form
for file in *.jpeg; do
num+=1
# convert num to a string
ascii_num $num
#rename the file
mv -v "$file" Image"${picnum}.jpeg"
done
jschiwal@hpmedia:~/test/testdir> ./test.sh
`11554.jpeg' -> `Image0001.jpeg'
`1159.jpeg' -> `Image0002.jpeg'
`13536.jpeg' -> `Image0003.jpeg'
`14142.jpeg' -> `Image0004.jpeg'
`14145.jpeg' -> `Image0005.jpeg'
`14340.jpeg' -> `Image0006.jpeg'
`14385.jpeg' -> `Image0007.jpeg'
`14879.jpeg' -> `Image0008.jpeg'
`15533.jpeg' -> `Image0009.jpeg'
`15742.jpeg' -> `Image0010.jpeg'
`16307.jpeg' -> `Image0011.jpeg'
`16814.jpeg' -> `Image0012.jpeg'
`17242.jpeg' -> `Image0013.jpeg'
`17722.jpeg' -> `Image0014.jpeg'
`18214.jpeg' -> `Image0015.jpeg'
`19786.jpeg' -> `Image0016.jpeg'
`20854.jpeg' -> `Image0017.jpeg'
`20881.jpeg' -> `Image0018.jpeg'
`208.jpeg' -> `Image0019.jpeg'
`21262.jpeg' -> `Image0020.jpeg'
`21366.jpeg' -> `Image0021.jpeg'
`21866.jpeg' -> `Image0022.jpeg'
`22734.jpeg' -> `Image0023.jpeg'
`22845.jpeg' -> `Image0024.jpeg'
`22942.jpeg' -> `Image0025.jpeg'
`23037.jpeg' -> `Image0026.jpeg'
`24374.jpeg' -> `Image0027.jpeg'
`2453.jpeg' -> `Image0028.jpeg'
`2515.jpeg' -> `Image0029.jpeg'
`25293.jpeg' -> `Image0030.jpeg'
`25547.jpeg' -> `Image0031.jpeg'
`27406.jpeg' -> `Image0032.jpeg'
`27809.jpeg' -> `Image0033.jpeg'
`29139.jpeg' -> `Image0034.jpeg'
`29264.jpeg' -> `Image0035.jpeg'
`30704.jpeg' -> `Image0036.jpeg'
`30845.jpeg' -> `Image0037.jpeg'
`31336.jpeg' -> `Image0038.jpeg'
`31690.jpeg' -> `Image0039.jpeg'
`32360.jpeg' -> `Image0040.jpeg'
`3837.jpeg' -> `Image0041.jpeg'
`4900.jpeg' -> `Image0042.jpeg'
`6118.jpeg' -> `Image0043.jpeg'
`611.jpeg' -> `Image0044.jpeg'
`6197.jpeg' -> `Image0045.jpeg'
`62.jpeg' -> `Image0046.jpeg'
`7824.jpeg' -> `Image0047.jpeg'
`8051.jpeg' -> `Image0048.jpeg'
`8632.jpeg' -> `Image0049.jpeg'
There are a few things to point out here. The first part of the function adds the '000' string before the number. The next line used ${variable:offset:length} with a negative offset.
There's a gotha however. ${picnum:-4:4} doesn't work right because '-4' here is a string. That is why I used $((-4)) to make certain it is an arithmetic expression.
So your simple little task involved:
- variable expansion
- functions
- loops
- $((...)) for arithmetic expressions
- Using "declare -i" so that the variable stays an integer.