#!/bin/sh PATH=/bin:/usr/bin export PATH # mved.sh # Move-and-edit filenames. # # Usage: mved [-n] from-pattern to-pattern # # This command allows you to change file names much as is possible # with some versions of PIP (remember *.txt=*.bak?). # The '=' character in from-pattern is treated as a special wildcard, # matching in the same way as the shell '*' wildcard character, except # that the text matching the '=' in the first pattern is inserted in # place of any = wildcards in the second. # Note that from-pattern need not have a wildcard if to-pattern does, # a default # # Use the '-n' option to do nothing, showing what would be done. # # Restrictions: # Only the first '=' sign in from-pattern is used. Multiple = # wildcards in from-pattern match up with the first from-pattern # =, ie: there is no matching for multiple = signs. (I'm sure # someone could make it work if they wanted to... ?) # # eg: mved lib=.a =.a moves libhello.a to hello.a # mved =.o =.o.old moves fred.o to fred.o.old # mved '=.*' = moves fred.junk to fred # mved =.sh = moves mved.sh to mved # mved *.sh =. # # Brian Coogan 06 Jan 87 # Hewlett-Packard Australian Software Operation # $Header: mved,v 1.2 88/09/29 22:35:48 brian Exp $ ASO myname=`basename $0` shopt=x case "$1" in -n) shopt=vn; shift ;; -*) echo $myname: unknown option $1 1>&2 exit 1 ;; esac case $# in 2) ;; *) echo usage: $myname from-pattern to-pattern 1>&2 exit 1 ;; esac # Check for appropriate wildcards. # Source must have an = wildcard or already exist. case "$1" in *=*) ;; *) for n in $1 do if [ ! \( -f "$n" -o -b "$n" -o -c "$n" \) ] then echo $myname: no files match $1 1>&2 exit 1 elif [ "$2x" = =x ] then echo $myname: impossible 1>&2 exit 1 fi break done ;; esac case "$2" in *=*) ;; *) echo $myname: no \'=\' wildcards used in target 1>&2 exit 1 ;; esac # catch mved = = case "$1$2" in ==) echo $myname: impossible 1>&2 exit 1 ;; esac globpatt=`echo $1 | sed 's/=/\*/'` frompatt=`echo "$1" | sed \ -e 's/\./\\\\./g' \ -e 's/\*/.*/g' \ -e 's/?/./g' \ -e 's/=/\\\\(\\.\\*\\\\)/' \ -e '/\\\\(/ !s/.*/\\\\(&\\\\)/' ` topatt=`echo "$2" | sed -e 's/=/\\\\1/g'` for n in $globpatt do # Check the pattern got expanded. (The file might also have vanished). if [ ! \( -f $n -o -c $n -o -b $n \) ] then echo $myname: no files matching $1 found 1>&2 exit 1 fi echo $n done | sed -n "s;$frompatt;mv '&' '$topatt';p" | sh -$shopt