Rename pictures in the command-line interface

nvidican at envieweb.net nvidican at envieweb.net
Mon Jan 4 20:25:40 UTC 2010


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

> 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 freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe at freebsd.org"
>

Dario,

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  
",++$cntr,".\n";

foreach (@files) {
         chomp();
         # 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);
         $cntr++;
}

### END OF SCRIPT ###

An example given a directory with files like:

blah.Jpg
bs432.jpg
bsd11.jpg
bsl.jpg
uh-oh.jpG
yourSelf.JPG

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 vidican.com




More information about the freebsd-questions mailing list