Quoting "Dário \"P." <fbsd.questions.l...@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@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@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/,@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
nat...@vidican.com


_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to