pattern matching rename...

Joe Smith jes at martnet.com
Fri Dec 29 05:09:21 UTC 2006


Todd Zullinger wrote:
>...
> There are other rename programs that do work this way.  It's annoying
> if you switch between such systems and find out that rename doesn't
> behave like you're expecting. :)

Which is a good reason to not depend on it.

I've learned to type up something like this:

$ for f in *.{JP*G,jpeg};do n=`echo "$f"| \
sed -e "s/\.jpe*g/.jpg/i"`; echo mv "$f" "$n"; done

easily enough that I don't miss something like 'rename' too much. I can 
easily tailor the command to the need of the moment (e.g. substitute tr 
for sed) and I can easily see the results before I do anything horrible 
(note the 'echo mv').

For a rename command you can easily take with you, here's one that 
allows regular expressions, and comes complete with diagnostics and 
error checking ;-)

# usage: rename from to files...
#
function rename () {
     local from="$1"; shift
     local to="$1"; shift
     local n=0
     local f

     for f in "$@"
     do
       local new=`echo "$f" | sed -e "s$from$tog"`

       # some problem with regexp: give up
       test $? = 0 -a "$new" || break

       if [ "$f" != "$new" ]
       then
	  if [ -f "$new" ]
	  then
	      echo "file '$new' exists: skipped" >&2
	  else
	      echo mv "$f" "$new" && n=$(($n+1))
	  fi
       fi
     done
     echo "renamed $n files" >&2
}

NOTE: The safety is 'on' here too. Change 'echo mv' to 'mv' if you want 
to use it, but don't say I didn't warn you when it eats your homework 
and kicks your dog.

NOTE ALSO: The sed command uses Ctrl-V as a separator character, just to 
avoid having to quote the separator in the $from pattern. It may get 
lost or mangled in the mail.

Add to your ~/.bashrc and season to taste.

<Joe




More information about the fedora-list mailing list