[PERL] Accès aux fichiers dans sous dossiers

Résolu/Fermé
bonjovi -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

Je viens de créer un petit prog en PERL permettant de rechercher dans un fichier un paramètre entré par l'utilisateur.

Le seul problème est que dans les répertoires définis, il existe plusieurs sous répertoires. Est-ce que quelqu'un pourrait me dire quelle solution devrai-je choisir pour pouvoir parcourir tous les fichiers, surtout ceux qui sont dans les sous-dossiers.

Je vous remercie d'avance.

voici le code que j'ai fait pour vous donner un ordre d'idée du truc.

#!/usr/bin/perl
use strict;use warnings; 

print "Veuillez entrer le chemin du dossier : \n";
my $path = <STDIN>;
chomp($path);

#Le chemin du fichier config.cfg est passé en paramètre par l'utilisateur
print "Veuillez entrer le message d'erreur que vous voulez rechercher : \n";
my $exp = <STDIN>;
chomp($exp);               

#Parcoure le dossier.
my $dossierData = $path."/batch/outil_maaf"; 
opendir DIR, $dossierData or die "$dossierData n'existe pas !"; 
my @files = readdir DIR; 
foreach my $fichier (@files) { 
	#Ouvre le fichier trouvé.
	open F_LIRE,$fichier  or die "\n######## KO ##########\nE/S : $!\n\n";
	my $erreur=0;
	#Lit toutes les lignes du fichier traité.
	while (<F_LIRE>) {
		if(m/$exp/){
			#Expression trouvée par l'expression régulière
			$erreur=1;
		}
	}
	close F_LIRE;	
	#Si le paramètre passé par l'utilisateur a été trouvé par l'expression régulière, un message l'informe
	if($erreur==1){
		print "\n#######FICHIER CONTENANT UNE ERREUR######\n";
		print "$dossierData/$fichier\n";
	}
} 
close DIR; 
Configuration: Windows 2000
Firefox 2.0.0.3

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Le script
    #!/usr/bin/perl
    use strict;use warnings;
    use File::Find;
    
    print "Veuillez entrer le chemin du dossier : ";
    chomp(my $path = <STDIN>);
    
    #Le chemin du fichier config.cfg est passé en paramètre par l'utilisateur
    print "Veuillez entrer le message d'erreur que vous voulez rechercher : ";
    chomp(my $exp = <STDIN>);
    
    sub recherche {
      if (-f){
        print "**** FICHIER CONTENANT UNE ERREUR ****\n$File::Find::dir/$_\n"
            if grep { /$exp/ } `cat $_`;
      }
    }
    find(\&recherche,"$path");
    __END__
    l'arborescence
    lami20j@debian:~$ ls -lR /home/lami20j/bonjovi/
    /home/lami20j/bonjovi/:
    total 12
    drwxr-xr-x 3 lami20j lami20j 4096 2007-07-03 20:18 a
    drwxr-xr-x 3 lami20j lami20j 4096 2007-07-03 20:19 b
    -rw-r--r-- 1 lami20j lami20j    5 2007-07-03 20:17 fic.txt
    
    /home/lami20j/bonjovi/a:
    total 8
    drwxr-xr-x 3 lami20j lami20j 4096 2007-07-03 20:17 aa
    -rw-r--r-- 1 lami20j lami20j    5 2007-07-03 20:18 fic2.txt
    
    /home/lami20j/bonjovi/a/aa:
    total 4
    drwxr-xr-x 2 lami20j lami20j 4096 2007-07-03 20:17 aaa
    
    /home/lami20j/bonjovi/a/aa/aaa:
    total 0
    
    /home/lami20j/bonjovi/b:
    total 8
    drwxr-xr-x 2 lami20j lami20j 4096 2007-07-03 20:17 bb
    -rw-r--r-- 1 lami20j lami20j    5 2007-07-03 20:19 fic3.txt
    
    /home/lami20j/bonjovi/b/bb:
    total 0
    
    Les erreurs
    lami20j@debian:~$ rgrep 'err' /home/lami20j/bonjovi/
    /home/lami20j/bonjovi/a/fic2.txt:err2
    /home/lami20j/bonjovi/fic.txt:err1
    /home/lami20j/bonjovi/b/fic3.txt:err3
    
    L'exécution du script
    lami20j@debian:~$ perl ccm.pl
    Veuillez entrer le chemin du dossier : /home/lami20j/bonjovi
    Veuillez entrer le message d'erreur que vous voulez rechercher : err2
    **** FICHIER CONTENANT UNE ERREUR ****
    /home/lami20j/bonjovi/a/fic2.txt
    
    1
  2. bonjovi
     
    Ok lami20j,

    Cette solution me convient parfaitement. Je vois que tu as également optimisé le code. J'aurai quelques questions à te poser, si cela ne te dérange pas de me répondre.

    1- Que signifie if (-f){
    2 -Et que signifie `cat $_`

    En tout cas, tout marche pour le mieux, c'est parfait.
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    si cela ne te dérange pas de me répondre

    tu crois que je t'aurais donné ma version si ça m'aurait dérangé ?!!!! :-))

    1- Que signifie if (-f){

    il s'agit d'un test de fichiers
    explicitement on écrit
    -f $fichier

    dans ce cas le teste et fait sur $_ qui est une variable implicite

    donc pour des raisons de ma paresse, au lieu d'écrire if ( -f $_ ) j'ai écrit if (-f)

    2 -Et que signifie `cat $_`

    vu que tu es sous Linux, j'ai utilisé la commande système cat au lieu d'ouvrir les fichiers avec open
    les apostrophes inverses `` permettent de capturer le STDOUT ce qui m'a permis de faire un grep (attention il s'agit de la fonction grep du Perl et pas de la commande système grep)

    j'ai l'utilisé directement au lieu de stocker le résultat dans une variable (je pense que tu sais pourquoi :-))

    pour Windows il faut écrire `type $_`

    Si jamais tu n'arrives pas à taper les apostrophes inverses à cause de certaines restrictions tu peux utiliser à la place
    qx{cat $_}

    Voilà.
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    -f - fichier regulier
    0