Chmodeur (linux)

Contenu du snippet

Un jour me vint une idée saugrenue : me débarasser du mastodonte qui encrassait ma machine depuis des années de fidèles et loyaux plantages, et tenter l'expérience de deux systèmes Unix : Linux et FreeBSD.

J'ai donc installé Linux, pour commencer, il parait qu'il est moins intimidant que le premier. Mon choix s'est porté sur la distribution Slackware : pas de fariboles ornementales, juste un OS fonctionnel...

(NDLR: Patience, le rapport avec le code approche)

Puis j'ai voulu récupérer mes MP3s (quelques trentaines de CDs), et là mauvaise surprise : les fichiers recopiés étaient copiés par défaut en rwxrxrx, ce qui n'est pas vraiment l'idéal (l'idéal étant rwrr, pour un dossier partagé entre les utilisateurs...)

chmod propose bien une option récursive, mais ne distingue pas les fichiers des dossiers...

Je ne sais pas qui serait assez fou pour chmoder tout çà à la main (avec tous les répertoires, et les fichiers), donc je me suis fait un programme en C/Posix le faisant à ma place (feignasse powa)...

Le voici donc :

Source / Exemple :


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

void parse(void) {

	struct dirent* dossiers = NULL;
	DIR* dossier = NULL;
	struct stat infos;

	dossier = opendir(".");

	while ((dossiers = readdir(dossier)) != NULL) {

		stat(dossiers->d_name, &infos);

		if (S_ISDIR(infos.st_mode)) {

			char* commande = NULL;

			if (strcmp(dossiers->d_name, ".") == 0 || strcmp(dossiers->d_name, "..") == 0) continue;

			commande = malloc((strlen(dossiers->d_name) + 18) * sizeof(char));
			assert(commande != NULL);

			sprintf(commande, "chmod a=--- \"./%s\"", dossiers->d_name);
			system(commande);

			sprintf(commande, "chmod u=rwx \"./%s\"", dossiers->d_name);
			system(commande);

			free(commande);

			chdir(dossiers->d_name);
			parse();
			chdir("..");

		} else {

			char* commande = malloc((strlen(dossiers->d_name) + 18) * sizeof(char));
			assert(commande != NULL);

			sprintf(commande, "chmod a=--- \"./%s\"", dossiers->d_name);
			system(commande);

			sprintf(commande, "chmod u=rw \"./%s\"", dossiers->d_name);
			system(commande);

			free(commande);

		}

	}

	closedir(dossier);

}

int main(void) {

	parse();

	return EXIT_SUCCESS;

}

Conclusion :


Il a très bien fonctionné sur mes 20Go de fichiers, mais applique le même chmod à tous, donc si vous avez des vrais fichiers exécutables il faudra les chmoder manuellement, ou améliorer le programme...

Voila :p

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.