rename(3): program to modify a set file names
ggc at myrias.UUCP
ggc at myrias.UUCP
Fri Feb 27 07:45:15 AEST 1987
I wrote this program one day when I got tired of writing the
familliar 4 line shell script for the 97'th time that week.
See the README and rename.l files for all the directions.
Gilles
...!ihnp4!myrias!ggc
===================CUT HERE==================================
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# rename.c
# Makefile
# rename.l
# README
# This archive created: Thu Feb 26 14:15:16 1987
export PATH; PATH=/bin:$PATH
echo shar: extracting "'rename.c'" '(5547 characters)'
if test -f 'rename.c'
then
echo shar: will not over-write existing file "'rename.c'"
else
cat << \SHAR_EOF > 'rename.c'
/*
Project: rename
Module: main
File: rename.c $Revision$
Synopsis: rename [-i] file [...] [prefix]^=[suffix]
Option:
-i : interactive mode. Query before erasing a file
Machine: vax 780
Author: Gilles Chartrand
Purpose:
Rename many files by adding a suffix and/or prefix to each.
Date: Jan. 1986
*/
#include <stdio.h>
#include <strings.h>
#include <sys/file.h>
#define XBREAK '^'
#define RBREAK '='
#define MAX_LEN 40
#define ERROR(me) fprintf(stderr, "%s\n", me) ;
typedef enum {unknown, expand, replace} op_type_t ;
typedef enum {false, true} bool_t ;
extern int rename() ; /* libc function to rname files */
static void multi_exp() ; /* expand file names */
static void multi_rep() ; /* replace substring in file */
static void my_rename() ;
static char *sindex() ; /* find a substring in a string */
bool_t i_flag ;
void
main(argc, argv)
char *argv[] ;
int argc ;
{
char *str1, *str2, *scan ;
op_type_t op_type ;
if (strcmp(argv[1], "-i") == 0) {
i_flag = true ;
argv ++ ;
argc -- ;
}
if (argc < 3) {
ERROR("usage: rename [-i] file [...] [str1]<^|=>[str2]") ;
exit(1) ;
}
str1 = "" ;
str2 = "" ;
op_type = unknown ;
scan = argv[argc - 1] ;
if (scan[0] == XBREAK) {
op_type = expand ;
str2 = scan + 1 ;
} else {
str1 = scan ;
while (*scan != '\0' && *scan != XBREAK && *scan != RBREAK) scan++ ;
if (*scan == '\0') {
ERROR("rename: a ^ or a = must appear in the last argument");
exit(1) ;
}
str2 = scan + 1 ;
if (*scan == XBREAK) op_type = expand ;
else op_type = replace ;
*scan = '\0' ;
}
if ((strlen(str1) + strlen(str2)) == 0) {
ERROR("rename: one of str1 or str2 must be given") ;
exit(1) ;
}
if (op_type == expand) multi_exp(argv + 1, argc - 2, str1, str2) ;
else multi_rep(argv + 1, argc - 2, str1, str2) ;
} /* main */
/*
Procedure: multi_exp(file_array, count, prefix, suffix)
Parameters:
file_array : array of files to be moved.
count : number of files in above array.
prefix : prefix to add to the front of the file.
suffix : suffix to add to the front of the file.
Description:
Expand each of the given files to have the given prefix and suffix.
*/
static void
multi_exp(file_array, count, prefix, suffix)
char *file_array[] ;
int count ;
char *prefix, *suffix ;
{
char *new_file ;
int max_len, pad, length, rc ;
max_len = MAX_LEN ;
new_file = (char *) malloc((unsigned int) max_len) ;
pad = strlen(prefix) + strlen(suffix) + 1 ;
while (count-- > 0) {
length = strlen(file_array[count]) + pad ;
if (length > max_len) {
max_len = 2 * length ;
free(new_file) ;
new_file = (char *) malloc((unsigned int) max_len) ;
}
strcpy(new_file, prefix) ;
strcat(new_file, file_array[count]) ;
strcat(new_file, suffix) ;
my_rename(file_array[count], new_file) ;
}
return ;
} /* multi_exp */
/*
Procedure: multi_rep(file_array, count, old, new)
Parameters:
file_array : array of files to be moved.
count : number of files in above array.
old : subtring to be replaced.
new : string to replace substring.
Description:
call move for each of the given files.
*/
static void
multi_rep(file_array, count, old, new)
char *file_array[] ;
int count ;
char *old, *new ;
{
char *new_file, *substr ;
int max_len, pad, rc ;
int length, offset ;
max_len = MAX_LEN ;
new_file = (char *) malloc((unsigned int) max_len) ;
pad = strlen(new) - strlen(old) + 1 ;
if (strlen(old) == 0) {
ERROR("rename: no substring given") ;
exit(1) ;
}
while (count-- > 0) {
length = strlen(file_array[count]) + pad ;
if (length > max_len) {
max_len = 2 * length ;
free(new_file) ;
new_file = (char *) malloc((unsigned int) max_len) ;
}
substr = sindex(file_array[count], old) ;
if (substr == NULL) {
fprintf(stderr, "rename: substring not found in %s\n",
file_array[count]) ;
continue ;
}
offset = substr - file_array[count] ;
strncpy(new_file, file_array[count], offset) ;
new_file[offset] = '\0' ;
strcat(new_file, new) ;
strcat(new_file, file_array[count] + offset + strlen(old)) ;
my_rename(file_array[count], new_file) ;
}
return ;
} /* multi_rep */
/*
Procedure: my_rename(old, new) ;
Parameters:
old = old file name
new = new file name
Description:
call rename and give appropriate error messages.
if the -i option was given then make sure new doesn't exist.
Method:
rename(2), perror(3), and access(2)
*/
static void
my_rename(old, new)
char *old, *new ;
{
char reply[80] ;
int rc ;
if ((i_flag) && (access(new, F_OK) == 0)) {
fprintf(stderr, "Ok to replace %s?", new) ;
scanf("%s", reply) ;
if (reply[0] != 'y') return ;
}
rc = rename(old, new) ;
if (rc != 0) perror(old) ;
return ;
}
/*
Function: sindex(master, sub)
Parameters:
master - string in which sub is to be found
sub - string to look for in master
Description:
return a substring pointer to master or NULL if the substring is
not contained.
*/
static char *
sindex(master, sub)
char *master, *sub ;
{
char *mptr, *sptr, *ptr ;
int mlen, slen ;
mlen = strlen(master) ;
slen = strlen(sub) ;
if (mlen < slen) return (NULL) ;
if (slen == 0) return(NULL) ;
mptr = master ;
while (strlen(mptr) >= slen) {
while (*mptr != sub[0]) {
if (*mptr == '\0') return (NULL) ;
mptr ++ ;
}
sptr = sub ;
ptr = mptr ;
while (*ptr++ == *sptr++) {
if (*sptr == '\0') return (mptr) ;
}
mptr++ ;
}
return (NULL) ;
} /* sindex */
SHAR_EOF
fi # end of overwriting check
echo shar: extracting "'Makefile'" '(868 characters)'
if test -f 'Makefile'
then
echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
BINDEST = /usr/local/bin
DOCDEST = /usr/man/manl
CC = cc
CFLAGS = -c -O
LD = cc
LDFLAGS =
LIBS =
OBJS = rename.o
SRCS = rename.c
HDRS =
MAKEFILE = Makefile
DOC = rename.l
PROGRAM = rename
SHAR = shar
SHARFLAGS = -v
SHARFILES = $(SRCS) $(HDRS) $(MAKEFILE) $(DOC) README
SHARFILE = rename.shar
build: $(PROGRAM)
$(PROGRAM): $(OBJS)
$(LD) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
install: $(PROGRAM)
rm -f $(BINDEST)/$(PROGRAM)
cp $(PROGRAM) $(BINDEST)
chmod 755 $(BINDEST)/$(PROGRAM)
rm -f $(DOCDEST)/$(DOC)
cp $(DOC) $(DOCDEST)
chmod 644 $(DOCDEST)/$(DOC)
clean:; rm -f $(OBJS) $(SHARFILE)
clobber: clean
rm -f $(PROGRAM)
shar:; $(SHAR) $(SHARFLAGS) $(SHARFILES) > $(SHARFILE)
.c.o:; $(CC) ${CFLAGS} $<
###
rename.o: /usr/include/stdio.h
SHAR_EOF
fi # end of overwriting check
echo shar: extracting "'rename.l'" '(901 characters)'
if test -f 'rename.l'
then
echo shar: will not over-write existing file "'rename.l'"
else
cat << \SHAR_EOF > 'rename.l'
.TH RENAME
.SH NAME
rename - change the names of a set of files.
.SH SYNOPSIS
\fBrename [-i] file [...] <str1>^|=<str2>\fR
.SH DESCRIPTION
.PP
Rename will change the names of all the given files according to the
command specified as the last argument. The -i (interactive) option
will prompt the user if the resulting file already exists.
.PP
Here are the valid commands to given in the last argument and what they
stand for:
.br
.in +6c
.ti -5c
<str1>=<str2> : The string str1 is looked for in each file name and is
replaced with str2.
.ti -5c
<str>= : The string str is deleted from each file name.
.ti -5c
<str>^ : The string str is added as a prefix to each file name.
.ti -5c
^<str> : The string str is added as a suffix to each file name.
.ti -5c
<str1>^<str2> : Combines last two operations.
.PP
The last argument must contain either a `=' or a `^'.
.SH AUTHOR
Gilles Chartrand
.SH BUGS
SHAR_EOF
fi # end of overwriting check
echo shar: extracting "'README'" '(79 characters)'
if test -f 'README'
then
echo shar: will not over-write existing file "'README'"
else
cat << \SHAR_EOF > 'README'
Set up the BINDEST and DOCDEST macros in the makefile and type
"make install"
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
More information about the Comp.sources.unix
mailing list