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