gcc -o rename rename.c
codice:
rename.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define DEFAULT_DIR_TO_SCAN		"."

#define CHR_TO_CHANGE			' '
#define CHR_CHANGED			'_'


char * stredit ( const char * s, char c1, char c2 );



int main ( int argc, char * argv [ ] )
{
	DIR * directory;
	struct dirent * fileInDir;
	int fd;
	char * dirname;
	
	char * newname;
	
	if ( argc > 2 ) {		// FIXME: Devo poter scannare piu' dirs.
		printf ( "Troppi argomenti.\nUsage: %s [DIRECTORY]\n", argv[0] );
		exit ( 1 );
	} else if ( argc == 2 ) {
		dirname = argv[1];
	} else {			// argc == 1
		dirname = DEFAULT_DIR_TO_SCAN;
	}
	
	
	directory = opendir ( dirname );
	if ( directory == NULL ) {
		printf ( "Non posso fare un listato della directory \"%s\".\n" );
		exit ( 1 );
	}
	
	fd = dirfd ( directory );
	chdir ( dirname );
	
	while ( ( fileInDir = readdir ( directory ) ) != NULL ) {
		newname = stredit ( fileInDir->d_name, CHR_TO_CHANGE, CHR_CHANGED );
		
		rename ( fileInDir->d_name, newname );
		
		free ( newname );
	}
	
	closedir ( directory );
	
	
	return 0;
}

char * stredit ( const char * s, char c1, char c2 )
{
	int len = strlen(s);
	char * rs = (char *) malloc ( len + 1 );
	int i;
	
	for ( i = 0; *(s+i); i ++ ) {
		if ( *(s+i) == c1 ) {
			*(rs+i) = c2;
		} else {
			*(rs+i) = *(s+i);
		}
	}
	*(rs+i+1) = '\0';
	
	return rs;
}