[PERL] Accès aux fichiers dans sous dossiers

Résolu/Fermé
Utilisateur anonyme - 3 juil. 2007 à 17:01
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 4 juil. 2007 à 21:57
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; 

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
3 juil. 2007 à 20:42
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
Utilisateur anonyme
4 juil. 2007 à 15:40
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
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
4 juil. 2007 à 16:13
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
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
4 juil. 2007 à 21:57
-f - fichier regulier
0