Rename pictures in the command-line interface

nvidican at nvidican at
Mon Jan 4 20:25:40 UTC 2010

Quoting "Dário \"P." <fbsd.questions.list at>:

> Hello,
> I have one directory with some pictures that I wanna rename (I use csh,
> don't know if that matters).
> For exemple, I have:
> b.jpg
> bs.jpg
> bsd.jpg
> And I wanna change to:
> bsd1.jpg
> bsd2.jpg
> bsd3.jpg
> I really appreciate if someone can help me. :)
> Regards,
> _______________________________________________
> freebsd-questions at mailing list
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe at"


I'm not personally aware of any single commands which allow  
substitution using a counter like you're asking, or of a decent way to  
do what you're asking from the shell script either; however,  
personally I'd write a simple Perl script to do it. The trick being to  
be able to find the bsd###.jpg where it left off at in a directory so  
you don't overwrite existing files if repeatability is important.

Here's something quick/dirty to work with, you can build from here,  
but try copy/pasting the following code into a new Perl script and run  
it from withing the directory you want to work:

#!/usr/bin/perl -w

use strict;

my @files = `ls`; # gets a list of all files in the current dir
# start a counter at zero, then increment it below:
my $cntr=0;
# set counter to the largest bsd###.jpg file in this directory:
map { if (/^bsd(\d+)\.jpg/) { $cntr = $1 if($1>$cntr); } }  
grep(/bsd\d+\.jpg/, at files);

print "Left off last time at $cntr, going to start this time at  

foreach (@files) {
         # skip all files which are already named bsd###.jpg
         # or are not in ending .jpg
         next if ($_ =~ /bsd\d+\.jpg/ || $_ !~ /(\.jpg)$/i);

         my $new = $_;
         # use a regular expression to substitute the name
         # (note /i == case insensative so it will match '.JPG' as well)
         $new =~ s/^(.+)\.jpg$/bsd$cntr\.jpg/i;

         print "Renaming $_ to $new\n";
         # un-comment the line below to actually do the rename:
         # rename($_,$new);


An example given a directory with files like:


Will give you an output like:

Left off last time at 11, going to start this time at 12.
Renaming blah.Jpg to bsd12.jpg
Renaming bs432.jpg to bsd13.jpg
Renaming bsl.jpg to bsd14.jpg
Renaming uh-oh.jpG to bsd15.jpg
Renaming youSelf.JPG to bsd16.jpg

My $0.02 ... like anything, sure you could do this 100 different other  
ways, and sure it's not going to be really efficient for large  
volumes, but in a pinch it'll work pretty reliably.

Nathan Vidican
nathan at

More information about the freebsd-questions mailing list