renames.c

デジタルカメラで取った写真がいっぱいたまりました。JPG ファイルで保存してあるのですが、いちいち名前をつけるのは面倒です。それで、画像に 1 〜 999 までの連番をふって整理するプログラムを作ってみました。.jpg のところを .gif などに変えると、たまったクリップアートのコレクションを整理することができます。

このプログラムは、変えたいファイルのあるディレクトリーに置いて使います。ファイル名を書き換えてしまうので、作業用ディレクトリーにファイルを移してやったほうが安全です。ファイル名の取得は ls コマンドをつかって、list.txt を生成するという手の抜いたことをやっています。しかし、こうすることによって、変換したファイルのリストを保存することができ、「まずいな」と思ったときにもとに戻すことができるのです。prefix に -r と入れることによってこの機能が使えるようにしてみました。

/*

renames.c

*/

#include <stdio.h>

/* Globals */
char data[999][80], prefix[80];
int sum;

main(int argc, char *argv[])
{
if(argc<2){
    printf("Usage: renames prefix\n");
    printf("For resume: renames -r\n");
    exit(0);
    }
strcpy(prefix, argv[1]);
if(strcmp(prefix, "-r")==0){
    printf("Working...");
    system("cp list.txt list2.txt");
    check();
    reverse();
    printf("done\n");
    exit(0);
    }
check();
printf("Are you sure to change file names? [y/n] ");
if(getchar()!='y')
    exit(0);
printf("Working...");
convert();
printf("done\n");
}

check()
{
FILE *inp;
int i, j;
char buf[80];

system("ls *.jpg>list.txt");

if((inp=fopen("list.txt", "r"))==NULL){
    printf("Can't open <list.txt>\n");
    exit(0);
    }

sum=0;
while(fgets(buf, 80, inp)!=NULL){
    buf[strlen(buf)-1]='\0';
    strcpy(data[sum++], buf);
    }

for(i=0; i<sum; i++){
    for(j=0; j<sum; j++){
        sprintf(buf, "%s%03d.jpg", prefix, j+1);
        if(strcmp(data[i], buf)==0){
            printf("Conflict with %s.\n", buf);
            exit(0);
            }
        }
    }
}

convert()
{
int i;
char command[120];

for(i=0; i<sum; i++){
    sprintf(command, "mv %s %s%03d.jpg", data[i], prefix, i+1);
    system(command);
    }
}

reverse()
{
FILE *inp;
int i;
char buf[80], command[120];

if((inp=fopen("list2.txt", "r"))==NULL){
    printf("Can't open <list.txt>\n");
    exit(0);
    }

i=0;
while(fgets(buf, 80, inp)!=NULL){
    buf[strlen(buf)-1]='\0';
    sprintf(command, "mv %s %s", data[i++], buf);
    if(system(command)!=0){
        printf("System error.\n");
        exit(0);
        }
    }
}

[目次にもどる]