/* Sam Trenholme 2010 Public domain */ #include #include #include #include #include #include char sanechr(char in) { if(in >= '0' && in <= '9') { return in; } if(in >= 'A' && in <= 'Z') { return in; } if(in == '.' || in == '_' || in == '-' || in == '/') { return in; } if(in >= 'a' && in <= 'z') { return in; } return '_'; } /* Convert anything in a filename that is not [A-Za-z0-9\-\.] into a _ */ void c_dir(char *path, int depth) { DIR *dir; struct dirent *rd; struct stat stats; char fullname[1024]; char sanename[1024]; int a; if(depth > 256) { return; } dir = opendir(path); if(dir == NULL) { return; } for(;;) { rd = readdir(dir); if(rd == NULL || rd->d_name == NULL) { return; } /* Skip "." and ".."; this is imperfect because it * also skips .{anything} */ if(strlen(rd->d_name) <= 2 && *(rd->d_name) == '.') { continue; } snprintf(fullname,1022,"%s/%s",path,rd->d_name); strncpy(sanename,fullname,1023); for(a = 0 ; a < 1023 ; a++) { if(*(sanename + a) == 0) { break; } *(sanename + a) = sanechr(*(sanename + a)); } if(lstat(fullname,&stats) != 0) { /* Error */ continue; } rename(fullname,sanename); if(S_ISDIR(stats.st_mode)) { c_dir(sanename,depth + 1); } } } main() { c_dir(".",1); }