[PERL] Accès aux fichiers dans sous dossiers
Résolu/Fermé
Utilisateur anonyme
-
lami20j Messages postés 21331 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21331 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.
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;
A voir également:
- Dans le gestionnaire de fichiers ci-dessous : dans le dossier musiques, créez un dossier playlist. cherchez les musiques hip-hop et country. déplacez-les dans le dossier playlist que vous avez créé.
- Dossier appdata - Guide
- Impossible de supprimer un dossier - Guide
- Mettre un mot de passe sur un dossier - Guide
- Vous avez besoin d'une autorisation de la part de système pour modifier ce dossier - Guide
- Dossier démarrage - Guide
4 réponses
Salut,
Le script
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 0Les 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:err3L'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
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.
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.
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à.
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à.