Jason
Jason

Reputation: 11363

Rename files using bash script

I have a bash script set that executes in a folder containing a number of photos and sequentially stitches them into panoramas based on the user input. Once the generation is completed, the output file is renamed to $x-pano.jpg and moved one folder higher.

My issue is the number prefix is based on the sequential execution of the script, meaning all files get renamed 1-pano.jpg to n-pano.jpg based on the number of panoramas generated during the script execution.

How can I modify the renaming process to look at the storage folder and get the largest $x? I want to increment that number by 1 and use as the file's numerical prefix. My current code is

//get the list of files in directory and sort in increasing order
$filelist=$(find ../ -maxdepth 1 -type f | sort -n)

//get number of files
$length=${filelist[@]}

//get the last file
$lastFile=${fileList[$((length-1))]}

will get a list of the files, sort in increasing order and get the last file from the list. This is where I get stuck. Using - as a delimiter, how can I capture the current value?

Upvotes: 1

Views: 1705

Answers (2)

Jadu Saikia
Jadu Saikia

Reputation: 21

Assuming this is just a renaming task:

$ find jason-pics/ -type f
jason-pics/other.jpg
jason-pics/somefile.jpg
jason-pics/mountain.jpg
jason-pics/car.jpg

Renaming:

i=0 
for jfile in $(find jason-pics/ -type f)
    do 
        echo "Renaming $jfile to jason-pics-rename/$i-pano-$(basename $jfile)" 
        ((i+=1)) 
        cp -v $jfile jason-pics-rename/$i-pano-$(basename $jfile)
done

Content of jason-pics-rename directory:

$ find jason-pics-rename/ -type f 
jason-pics-rename/4-pano-car.jpg
jason-pics-rename/1-pano-other.jpg
jason-pics-rename/3-pano-mountain.jpg
jason-pics-rename/2-pano-somefile.jpg

Removing basename to rename files to 1-pano.jpg to n-pano.jpg

$ i=0; for jfile in $(find jason-pics/ -type f); do echo "Renaming $jfile to jason-pics-rename/$i-pano-$(basename $jfile)" ;((i+=1)); cp -v $jfile jason-pics-rename/$i-pano.jpg; done

Content is:

$ find jason-pics-rename/ -type f 
jason-pics-rename/3-pano.jpg
jason-pics-rename/2-pano.jpg
jason-pics-rename/1-pano.jpg
jason-pics-rename/4-pano.jpg

Upvotes: 1

sarnold
sarnold

Reputation: 104050

You're probably looking for the ${var%%foo} construct, which strips the longest foo from the end of a variable:

$ F=1-pano.jpg
$ echo ${F%%-pano.jpg}
1
$ F=1222-pano.jpg
$ echo ${F%%-pano.jpg}
1222

Try lastNum=${lastFile%%-pano.jpg}.

Upvotes: 1

Related Questions