/* * rename.c - aeb 2000-01-01 * -------------------------------------------------------------- #!/bin/sh if [ $# -le 2 ]; then echo call: rename from to files; exit; fi FROM="$1" TO="$2" shift shift for i in $@; do N=`echo "$i" | sed "s/$FROM/$TO/g"`; mv "$i" "$N"; done -------------------------------------------------------------- * This shell script will do renames of files, but may fail * in cases involving special characters. Here a C version. */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include "nls.h" static char *progname; static int do_rename(char *from, char *to, char *s) { char *newname, *where, *p, *q; int flen, tlen, slen; where = strstr(s, from); if (where == NULL) return 0; flen = strlen(from); tlen = strlen(to); slen = strlen(s); newname = malloc(tlen+slen+1); if (newname == NULL) { fprintf(stderr, _("%s: out of memory\n"), progname); exit(1); } p = s; q = newname; while (p < where) *q++ = *p++; p = to; while (*p) *q++ = *p++; p = where+flen; while (*p) *q++ = *p++; *q = 0; if (rename(s, newname) != 0) { int errsv = errno; fprintf(stderr, _("%s: renaming %s to %s failed: %s\n"), progname, s, newname, strerror(errsv)); exit(1); } return 1; } int main(int argc, char **argv) { char *from, *to, *p; int i; progname = argv[0]; if ((p = strrchr(progname, '/')) != NULL) progname = p+1; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); if (argc == 2) { if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) { printf(_("%s (%s)\n"), progname, PACKAGE_STRING); return 0; } } if (argc < 3) { fprintf(stderr, _("call: %s from to files...\n"), progname); exit(1); } from = argv[1]; to = argv[2]; for (i=3; i<argc; i++) do_rename(from, to, argv[i]); return 0; }