Ottimo thread... Bella idea andy!

Posso partire io?
Parto con la mia ultima creazione: "list.c"...
Per compilarlo basta dare un
"gcc list.c -o list"
e poi
"./list [directory]"
per eseguirlo... E' un sostituto dell'ls pieno di difetti...
codice:
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>

#define DIR_TO_SCAN		"."

#define	VERDE_SCURO		"\033[0;32m"
#define	VERDE_CHIARO	"\033[1;32m"
#define	BLU_SCURO		"\033[0;34m"
#define	BLU_CHIARO		"\033[1;34m"
#define	GIALLO_SCURO	"\033[0;33m"
#define	GIALLO_CHIARO	"\033[1;33m"
#define GRIGIO			"\033[1;30m"
#define	RESET_COLOR		"\x1b[00m"

int main ( int argc, char * argv [] ) {
	
	DIR * directory;
	struct dirent * fileInDir;
	int fd;
	char * dirname;
	
	if ( argc > 2 ) {	/* FIXME: Dovro' poter scannare piu' dirs. */
		printf ( "Troppi argomenti.\nUsage: %s [DIRECTORY]\n", argv[0] );
		exit ( 1 );
	} else if ( argc == 2 ) {
		dirname = argv[1];
	} else { /* if ( argc == 1 ) */
		dirname = DIR_TO_SCAN;
	}
	
	directory = opendir ( dirname );
	if ( directory == NULL ) {
		printf ( "Non posso fare un listato della directory \"%s\".\n" );
		exit ( 1 );
	}
	printf ( "Ecco il contenuto della directory \"%s\":\n", dirname );
	
	fd = dirfd ( directory );
	chdir ( dirname );
	
	while ( ( fileInDir = readdir ( directory ) ) != NULL ) {
		struct stat data;
			
		printf ( "\t" );
		
		stat ( fileInDir->d_name, &data );
		if ( S_ISDIR ( data.st_mode ) ) {
			if ( fileInDir->d_name[0] == '.' || fileInDir->d_name[strlen(fileInDir->d_name)-1] == '~' )
				printf ( "%s", BLU_SCURO );
			else
				printf ( "%s", BLU_CHIARO );
		} else if ( S_ISREG ( data.st_mode ) ) {
			if ( fileInDir->d_name[0] == '.' || fileInDir->d_name[strlen(fileInDir->d_name)-1] == '~' )
				printf ( "%s", GRIGIO);
		} else {
			printf ( "%s", GIALLO_CHIARO );
		}
		printf ( "%s%s %d bytes", fileInDir->d_name, RESET_COLOR, data.st_size );
		
		
		printf ( "\n" );
	}
	
	closedir ( directory );
	
	return 0;
}