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 #define RENAME_EXIT_SOMEOK 2
31 #define RENAME_EXIT_NOTHING 4
32 #define RENAME_EXIT_UNEXPLAINED 64
34 static int do_rename(char *from
, char *to
, char *s
, int verbose
, int symtarget
)
36 char *newname
= NULL
, *where
, *p
, *q
, *target
= NULL
;
37 int flen
, tlen
, slen
, ret
= 1;
41 if (lstat(s
, &sb
) == -1) {
42 warn(_("%s: lstat failed"), s
);
45 if (!S_ISLNK(sb
.st_mode
)) {
46 warnx(_("%s: not a symbolic link"), s
);
50 target
= xmalloc(sb
.st_size
+ 1);
51 if (readlink(s
, target
, sb
.st_size
+ 1) < 0) {
52 warn(_("%s: readlink failed"), s
);
57 target
[sb
.st_size
] = '\0';
58 where
= strstr(target
, from
);
62 file
= rindex(s
, '/');
65 where
= strstr(file
, from
);
75 slen
= strlen(target
);
81 newname
= xmalloc(tlen
+ slen
+ 1);
96 warn(_("%s: unlink failed"), s
);
100 if (symlink(newname
, s
) != 0) {
101 warn(_("%s: symlinking to %s failed"), s
, newname
);
106 printf("%s: `%s' -> `%s'\n", s
, target
, newname
);
108 if (rename(s
, newname
) != 0) {
109 warn(_("%s: rename to %s failed"), s
, newname
);
114 printf("`%s' -> `%s'\n", s
, newname
);
122 static void __attribute__ ((__noreturn__
)) usage(FILE * out
)
124 fputs(USAGE_HEADER
, out
);
126 _(" %s [options] expression replacement file...\n"),
127 program_invocation_short_name
);
128 fputs(USAGE_OPTIONS
, out
);
129 fputs(_(" -v, --verbose explain what is being done\n"), out
);
130 fputs(_(" -s, --symlink act on symlink target\n"), out
);
131 fputs(USAGE_SEPARATOR
, out
);
132 fputs(USAGE_HELP
, out
);
133 fputs(USAGE_VERSION
, out
);
134 fprintf(out
, USAGE_MAN_TAIL("rename(1)"));
135 exit(out
== stderr
? EXIT_FAILURE
: EXIT_SUCCESS
);
138 int main(int argc
, char **argv
)
141 int i
, c
, ret
= 0, symtarget
= 0, verbose
= 0;
143 static const struct option longopts
[] = {
144 {"verbose", no_argument
, NULL
, 'v'},
145 {"version", no_argument
, NULL
, 'V'},
146 {"help", no_argument
, NULL
, 'h'},
147 {"symlink", no_argument
, NULL
, 's'},
151 setlocale(LC_ALL
, "");
152 bindtextdomain(PACKAGE
, LOCALEDIR
);
154 atexit(close_stdout
);
156 while ((c
= getopt_long(argc
, argv
, "vsVh", longopts
, NULL
)) != -1)
165 printf(UTIL_LINUX_VERSION
);
177 warnx(_("not enough arguments"));
184 for (i
= 2; i
< argc
; i
++)
185 ret
|= do_rename(from
, to
, argv
[i
], verbose
, symtarget
);
189 return RENAME_EXIT_NOTHING
;
195 return RENAME_EXIT_SOMEOK
;
197 return RENAME_EXIT_UNEXPLAINED
;