2 * rename.c - aeb 2000-01-01
4 --------------------------------------------------------------
6 if [ $# -le 2 ]; then echo call: rename from to files; exit; fi
11 for i in $@; do N=`echo "$i" | sed "s/$FROM/$TO/g"`; mv "$i" "$N"; done
12 --------------------------------------------------------------
13 * This shell script will do renames of files, but may fail
14 * in cases involving special characters. Here a C version.
22 #include <sys/types.h>
28 #include "closestream.h"
30 static int do_rename(char *from
, char *to
, char *s
, int verbose
, int symtarget
)
32 char *newname
, *where
, *p
, *q
, *target
;
37 if (lstat(s
, &sb
) == -1)
38 err(EXIT_FAILURE
, _("%s: lstat failed"), s
);
40 if (!S_ISLNK(sb
.st_mode
))
41 errx(EXIT_FAILURE
, _("%s: not a symbolic link"), s
);
43 target
= xmalloc(sb
.st_size
+ 1);
44 if (readlink(s
, target
, sb
.st_size
+ 1) < 0)
45 err(EXIT_FAILURE
, _("%s: readlink failed"), s
);
47 target
[sb
.st_size
] = '\0';
48 where
= strstr(target
, from
);
50 where
= strstr(s
, from
);
58 slen
= strlen(target
);
64 newname
= xmalloc(tlen
+ slen
+ 1);
79 err(EXIT_FAILURE
, _("%s: unlink failed"), s
);
80 if (symlink(newname
, s
) != 0)
81 err(EXIT_FAILURE
, _("%s: symlinking to %s failed"), s
, newname
);
83 printf("%s: `%s' -> `%s'\n", s
, target
, newname
);
85 if (rename(s
, newname
) != 0)
86 err(EXIT_FAILURE
, _("%s: rename to %s failed"), s
, newname
);
88 printf("`%s' -> `%s'\n", s
, newname
);
95 static void __attribute__ ((__noreturn__
)) usage(FILE * out
)
97 fputs(_("\nUsage:\n"), out
);
99 _(" %s [options] expression replacement file...\n"),
100 program_invocation_short_name
);
102 fputs(_("\nOptions:\n"), out
);
103 fputs(_(" -v, --verbose explain what is being done\n"
104 " -V, --version output version information and exit\n"
105 " -s, --symlink act on symlink target\n"
106 " -h, --help display this help and exit\n\n"), out
);
108 exit(out
== stderr
? EXIT_FAILURE
: EXIT_SUCCESS
);
111 int main(int argc
, char **argv
)
114 int i
, c
, symtarget
=0, verbose
= 0;
116 static const struct option longopts
[] = {
117 {"verbose", no_argument
, NULL
, 'v'},
118 {"version", no_argument
, NULL
, 'V'},
119 {"help", no_argument
, NULL
, 'h'},
120 {"symlink", no_argument
, NULL
, 's'},
124 setlocale(LC_ALL
, "");
125 bindtextdomain(PACKAGE
, LOCALEDIR
);
127 atexit(close_stdout
);
129 while ((c
= getopt_long(argc
, argv
, "vsVh", longopts
, NULL
)) != -1)
138 printf(UTIL_LINUX_VERSION
);
150 warnx(_("not enough arguments"));
157 for (i
= 2; i
< argc
; i
++)
158 do_rename(from
, to
, argv
[i
], verbose
, symtarget
);