HELP: recherche de fichier en langage perl [Fermé]

Signaler
-
 pierrot75 -
Bonjour,
Je fais de la programmation en PERL.
En ce moment je voudrais en fait compter les fichiers qui se terminent par .sty dans un repertoire mais je ne sais pas trop comment faire (peut-etre manque de cafeine). Les fichier en fait ont des nom qui les numerorte en fait genre toto0001.sty, toto0002.sty etc...
Je pensais a un compteur simple mais avec une boucle while en disant:
$compteur =0;
tant que toto$i.sty existe (et c'est sur cette condition que je bloque)
{
$compteur++;
}

si quelqu'un a une proposition plus simple ou plus efficace je suis ouvert au conseil

4 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 543
Re,

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

}
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 543
Salut,

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{$_};
}
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