4 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
19 août 2009 à 13:41
19 août 2009 à 13:41
Re,
Les commentaires sont en gras
Les commentaires sont en gras
#!/usr/bin/perl # use warnings;use strict; use File::Find; # il s'agit du module Perl File::Find qui fournis la fonction find use File::Basename; # il s'agit du module Perl File::Basename qui fourni la fonction basename my (%ext,$fic); #%ext n'est pas un tableau mais un hash qui contient # des couples clé=valeur sub extension{ # début d'une procédure $fic = basename($File::Find::name); #$File::Find::name done le chemin complet de fichier # Ex: /chemin/vers/fichier.sty #basename permet d'extraire le nom de fichier de chemin complet # Ex: fichier.sty $ext{$1}++ if $fic =~ /.(sty)$/i; # ici en fait il y a une pétite erreur - j'ai oublié de mettre des paranthéses # la clé de hash sera sty et comme elle est unique # pour chaque nouveau fichier .sty la valeur de la clé sera incrementé de 1 # donc pour le 1er fichier clé=1 # pour le deuxième fichier clé=2 # etc. } find (\&extension,$ARGV[0]); # la fonction find du module File::Find # $ARGV[0] c'est le 1er argument de ligne de commande # c'est-à-dire le répertoire où on fait la recherche # dans l'exemple que je t'ai montré (et que tu as sûrement regardé) # j'ai exécuté perl exo_tematek1.pl ../bin/my_perl_script/ # donc le script on l'exécute avec la commande # perl script.pl /chemin/vers/repertoire foreach (sort keys %ext){ # keys %ext c'est un tableau qui contient seulement les clés du hash # dans notre cas il n'y a qu'une seule clé # sort fait le tri les clés, mais c'est vrai qu'il n'est pas nécessaire # vu qu'il n'y a qu'une seule clé (j'ai fait un copier / coller ) printf "extension %7s => %7s fois\n",$_,$ext{$_}; # pour comprendre %7s il suffit de lire la documentation # de la fonction sprintf du Perl }
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
19 août 2009 à 12:24
19 août 2009 à 12:24
Salut,
Pour les fichiers .sty
Pour toutes les extensions
Un exemple d'exécution ici https://forums.commentcamarche.net/forum/affich-2638000-perl-supprimer-les-fichiers-critere-taille#3
P.S. C'est pour ça que c'est bien de faire une recherche avant de poser la question ;-)
le 6ème lien sur la 1ère page
Pour les fichiers .sty
#!/usr/bin/perl # use warnings;use strict; use File::Find; use File::Basename; my (%ext,$fic); sub extension{ $fic = basename($File::Find::name); $ext{$1}++ if $fic =~ /.sty$/i; } find (\&extension,$ARGV[0]); foreach (sort keys %ext){ printf "extension %7s => %7s fois\n",$_,$ext{$_}; }
Pour toutes les extensions
#!/usr/bin/perl # use warnings;use strict; use File::Find; use File::Basename; my (%ext,$fic); sub extension{ $fic = basename($File::Find::name); if ($fic =~ /^\./){ # traitement de fichier cachés # sachant que sous GNU/Linux les fichiers cachés # commencent avec un point on risque de compter # tous les fichiers cachés en tant qu'extension $ext{$1}++ if $fic =~ /^\..+\.([a-z]+)$/i; } else { $ext{$1}++ if $fic =~ /.*\.([a-z]+)$/i; } } find (\&extension,$ARGV[0]); foreach (sort keys %ext){ printf "extension %7s => %7s fois\n",$_,$ext{$_}; }
Un exemple d'exécution ici https://forums.commentcamarche.net/forum/affich-2638000-perl-supprimer-les-fichiers-critere-taille#3
P.S. C'est pour ça que c'est bien de faire une recherche avant de poser la question ;-)
le 6ème lien sur la 1ère page
Merci lami20j,
mais la je comprend pas trop ce que donne chaque ligne (je suis novis en PERL et j'aime comprendre plutot que de recopier)
Pourrais-tu me commenter un peu cette ligne ou plutot celle que je ne comprend pas:
#!/usr/bin/perl........................................................ici je sais ce que c'est
#
use warnings;use strict;...........................................idem
use File::Find;..........la je pense savoir ca doit etre une fonction recherche de fichier(que je ne connaissait pas)
use File::Basename;......la je pense savoir aussi: une fonction recherche par nom surement
my (%ext,$fic);...................la on definit un tableau %ext pour extension et une variable $fic pour fichier
sub extension{.....................................la c juste nommer la proposition
$fic = basename($File::Find::name);##definition de la variable mais la je me demande ou mettre le nom ###########################de la serie de fichier
$ext{$1}++ if $fic =~ /.sty$/i; ##et la on met dans la deuxieme colonne du tableau extension je crois (mais #######################je pensais kil fallait metre un truc du genre %ext[1]) la valeur plus 1kan #######################on voi un fichier .sty.
}
find (\&extension,$ARGV[0]);##la par contre je conprend rien a partir de la pourquoi un $ARGV[0] qui sors #####################de nul part et sort keys ??? et le %7s????
foreach (sort keys %ext){
printf "extension %7s => %7s fois\n",$_,$ext{$_};
}
mais la je comprend pas trop ce que donne chaque ligne (je suis novis en PERL et j'aime comprendre plutot que de recopier)
Pourrais-tu me commenter un peu cette ligne ou plutot celle que je ne comprend pas:
#!/usr/bin/perl........................................................ici je sais ce que c'est
#
use warnings;use strict;...........................................idem
use File::Find;..........la je pense savoir ca doit etre une fonction recherche de fichier(que je ne connaissait pas)
use File::Basename;......la je pense savoir aussi: une fonction recherche par nom surement
my (%ext,$fic);...................la on definit un tableau %ext pour extension et une variable $fic pour fichier
sub extension{.....................................la c juste nommer la proposition
$fic = basename($File::Find::name);##definition de la variable mais la je me demande ou mettre le nom ###########################de la serie de fichier
$ext{$1}++ if $fic =~ /.sty$/i; ##et la on met dans la deuxieme colonne du tableau extension je crois (mais #######################je pensais kil fallait metre un truc du genre %ext[1]) la valeur plus 1kan #######################on voi un fichier .sty.
}
find (\&extension,$ARGV[0]);##la par contre je conprend rien a partir de la pourquoi un $ARGV[0] qui sors #####################de nul part et sort keys ??? et le %7s????
foreach (sort keys %ext){
printf "extension %7s => %7s fois\n",$_,$ext{$_};
}
Re
Ben perso je dois etre un peu polio parce que ca marche pas du tout .
j'ai fait un peu a ma sauce en remplacant $File::Find::name par C:\Documents and Settings\perso\Desktop\test\script en mettant lenom du premier fichier et une autre fois sans
J'ai aussi remplace ton sprintf par un print OUT en replacant les variable dans le bon endroit et en creant au debut un fichier texte OUT mais ca marche pas....... et puis il fait chaud ey en plus de ca je cherche a faire une incrementation dans un fichier batch et ca incremente mais quand je veu mettre une condition style if "<variable>" < "<valeur>" goto <debut de la boucle dincrementation> et if "<la meme variable>" == "<une autre valeur plus grande>" goto <endroit qui arrete>.....
si tu as des conseils c'est un langage totalement different mais bon je creuse je cherche et ca me donne toujours le meme bug la boucle passe la valeur du double egal et continu a s'incrementer
Ben perso je dois etre un peu polio parce que ca marche pas du tout .
j'ai fait un peu a ma sauce en remplacant $File::Find::name par C:\Documents and Settings\perso\Desktop\test\script en mettant lenom du premier fichier et une autre fois sans
J'ai aussi remplace ton sprintf par un print OUT en replacant les variable dans le bon endroit et en creant au debut un fichier texte OUT mais ca marche pas....... et puis il fait chaud ey en plus de ca je cherche a faire une incrementation dans un fichier batch et ca incremente mais quand je veu mettre une condition style if "<variable>" < "<valeur>" goto <debut de la boucle dincrementation> et if "<la meme variable>" == "<une autre valeur plus grande>" goto <endroit qui arrete>.....
si tu as des conseils c'est un langage totalement different mais bon je creuse je cherche et ca me donne toujours le meme bug la boucle passe la valeur du double egal et continu a s'incrementer