Дарю почти "готовое программное средство". Доработать напильником. ^_^
--- Makefile ---
NAME= rename-to1251
SRC= cpp
CC= gcc
CFLAGS= -ggdb -I/usr/local/include -liconv -L/usr/local/lib
$(NAME): $(NAME).$(SRC)
$(CC) $(CFLAGS) $(NAME).$(SRC) -o $(NAME)
--- rename-to1251.cpp ---
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <iconv.h>
#define FROM_866 1
#define FROM_KOI8 2
int action;
iconv_t conv_koi8_to_1251, conv_866_to_1251;
char cname[256];
char *valid_chars_koi8 = "ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапрол
char valid_chars_1251 [128];
int init_action( char *arg)
{
if (strcmp( arg, "866") == 0) action = FROM_866;
else if (strcmp( arg, "koi8") == 0) action = FROM_KOI8;
else action = 0;
return action;
}
void init_valid_chars()
{
const char * inbuf = valid_chars_koi8;
char *outbuf = valid_chars_1251;
size_t inlen = strlen(inbuf);
size_t outlen = 128;
memset( valid_chars_1251, 0, sizeof(valid_chars_1251));
size_t rslt = iconv( conv_koi8_to_1251, &inbuf, &inlen, &outbuf, &outlen);
}
int valid_name_1251( char *name)
{
unsigned char *c = (unsigned char *) name;
for (; *c; c++)
{
if ((*c > 128) && (strchr( valid_chars_1251, *c) == 0))
return 0;
}
return 1;
}
void list_dir( char *dirname)
{
chdir( dirname);
printf( "Entering %s\n", dirname);
DIR *dir = opendir( ".");
dirent *de;
while ((de = readdir(dir)) != NULL)
{
if (strcmp( de->d_name, ".") == 0) continue;
if (strcmp( de->d_name, "..") == 0) continue;
if (de->d_type == DT_DIR)
{
list_dir( de->d_name);
}
const char * inbuf = de->d_name;
char *outbuf = cname;
size_t inlen = strlen(inbuf);
size_t outlen = 255;;
memset( cname, 0, sizeof(cname));
size_t rslt = iconv( (action == FROM_866) ? conv_866_to_1251 : conv_koi8
if (rslt != -1)
{
if (!valid_name_1251( de->d_name))
{
if (strcmp( de->d_name, cname) != 0)
{
printf( "- %s -> %s\n", de->d_name, cname);
rename( de->d_name, cname);
}
}
}
}
chdir( "..");
printf( "Leaving %s\n", dirname);
}
int main( int argc, char ** args)
{
if (init_action(args[1]) == 0) return (-1);
conv_866_to_1251 = iconv_open( "cp1251", "cp866");
conv_koi8_to_1251 = iconv_open( "cp1251", "koi8-r");
init_valid_chars();
list_dir( ".");
iconv_close( conv_866_to_1251);
iconv_close( conv_koi8_to_1251);
}