デジタルカメラで取った写真がいっぱいたまりました。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); } } }