Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
2421 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Recherche dans arborescence et exclure dossier

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recherche dans arborescence et exclure dossier

n°2239993
coolkis
Posté le 10-10-2014 à 15:44:11  profilanswer
 

Bonjour,
 
Je voudrais faire une recherche de fichier dans une arborescence en y excluant un certain nombre de dossier.
 
J'ai commencé par le code suivant mais cela ne fonctionne pas :
 

Code :
  1. next if ($rep1 eq "." || $rep1 eq ".." || $rep1 =~ m/test/i);


 
Quelqu'un pourrait-il m'aider svp ?
 
Merci.

mood
Publicité
Posté le 10-10-2014 à 15:44:11  profilanswer
 

n°2240021
gilou
Modérateur
Modzilla
Posté le 10-10-2014 à 17:42:56  profilanswer
 

Regardes du côté du module Find::Find et de ses dérivés.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2240175
coolkis
Posté le 13-10-2014 à 17:02:52  profilanswer
 

J'ai vu qu'il existait File:Find ! Est ce que c'est la même chose ?

n°2240195
gilou
Modérateur
Modzilla
Posté le 13-10-2014 à 18:07:34  profilanswer
 

Oui, c'est File::Find que je voulais dire :o  
Dans ton cas, la variante File::Find::Rule serait plus adaptée avec qque chose du genre

Code :
  1. #!/usr/bin/perl
  2. use strictures; # ou use strict; use warnings; si le module strictures n'est pas installé dans votre config
  3. use File::Find::Rule;
  4.  
  5. my $rule = File::Find::Rule->new;
  6. $rule->or($rule->new->directory->name( qr/test/i )->prune->discard, $rule->new);
  7. my @files = $rule->in('.');
  8. ...


ou $rule->or(A, B); on va tenter d'appliquer les règles A ou B (et si on applique A, on essaye pas d'appliquer B, c'est important ici)
Avec $rule->new->directory->name( qr/test/i )->prune->discard on crée une nouvelle règle qui pour tout nom passé en entrée qui est un nom de répertoire vérifiant la regexp /test/ a pour action de ne pas aller dans le sous répertoire (prune) ni de mettre en sortie le nom en cours (discard).
Avec $rule->new on crée une nouvelle règle vide qui met en sortie tout nom qui lui est passé en entrée.  
Donc pour tout nom passé à la règle de base qui a pas été matché (et donc exclus) par la première règle, on copie a l'identique en sortie.
 
 
A+,


Message édité par gilou le 14-10-2014 à 12:50:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2240394
coolkis
Posté le 15-10-2014 à 18:17:08  profilanswer
 

Bonsoir Gilou,
 
Désolé de répondre si tardivement ! Merci dans tout les cas pour tes réponses.
 
Par contre j'ai essayé ton code mais cela ne fonctionne pas !
Il n'y a une façon de faire plus simple du genre le bout de code que j'ai posté en début de post ?

n°2240412
gilou
Modérateur
Modzilla
Posté le 15-10-2014 à 20:13:30  profilanswer
 

> Par contre j'ai essayé ton code mais cela ne fonctionne pas !  
Donc tu n'as pas bien testé. Je ne poste jamais un code dans la section perl sans l'avoir testé (vu a quel point c'est facile) sauf cas très exceptionnel d'environnement non reproductible sur ma machine (cas de connexion a un serveur particulier par exemple).
J'ai donné un code à utiliser (qui marche parfaitement), mais il faut faire un minimum de boulot pour l'adapter à ses besoins.
 
Quand au code que tu as posté, comme il n'y a aucun contexte, il est impossible de répondre. On n'a aucune idée de ce que contient $rep1 par exemple (ça provient d'un opendir ou quoi?)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2240445
coolkis
Posté le 16-10-2014 à 12:41:43  profilanswer
 

Bonjour Gilou,
 
Désolé, je me suis mal exprimé ! Je ne mets pas en doute que ton code fonctionne parfaitement. C'est juste que j'ai beau tourné ça dans tous les sens, ça ne fonctionne pas dans mon script... Et là je rejette la faute sur moi car j'essaye de comprendre mais ce n'est pas si simple quand on vient juste de se mettre à ce language !
 
Pour ce qui est de mon code :
 
ex : next if ($_ eq "." || $_ eq ".." || $_ =~ m/Nom_rep/i);
 
$_ est égal au chemin ou se trouve l'ensemble des répertoires à scanner.
Nom_rep est égal au nom du répertoire à exclure.

n°2240446
gilou
Modérateur
Modzilla
Posté le 16-10-2014 à 12:48:19  profilanswer
 

coolkis a écrit :

Bonjour Gilou,
$_ est égal au chemin ou se trouve l'ensemble des répertoires à scanner.
Nom_rep est égal au nom du répertoire à exclure.

Et comment c'est censé marcher alors?
Si tu as un next, tu as donc une boucle. tu boucles sur quoi?
Bref, tant que je n'ai qu'une ligne de code ET NON PAS LA PORTION UTILE DU SCRIPT POUR SAVOIR EXACTEMENT CE QUE TU FAIS, je suis dans l'incapacité totale de répondre.
Je ne veux pas des centaines de lignes, mais au moins assez de lignes pour savoir ce qui se passe (d'ou provient la valeur de $_, sur quoi on boucle...)
 
A+,


Message édité par gilou le 16-10-2014 à 12:51:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
n°2240450
coolkis
Posté le 16-10-2014 à 14:14:26  profilanswer
 

Pas de soucis !
 
my $dir = $ARGV[0];
 
find( \&search, $dir );
sub search {
if (-f "$_" ) {
next if ($_ eq "." || $_ eq ".." || $_ =~ m/Nom_rep/i);
 
....

n°2240459
gilou
Modérateur
Modzilla
Posté le 16-10-2014 à 15:09:01  profilanswer
 

Bon ben c'est un truc comme ceci alors:
 

Code :
  1. #!/usr/bin/perl
  2. use strictures;
  3. use File::Find;
  4.  
  5. my $dir = $ARGV[0];
  6. find( \&search, $dir );
  7.  
  8. sub search {
  9.  if (-d $_ ) {
  10.    # vire le cas . et le cas .. du traitement
  11.    return if (/^\.\.?$/);
  12.    if (/Nom_Rep/i) {
  13.      # ne vas pas inspecter le répertoire
  14.      $File::Find::prune = 1;
  15.      # et vire le répertoire du traitement
  16.      return;
  17.    }
  18.  }
  19.  # traitement, ici on imprime le nom de fichier (sans path)
  20.  print "$_\n";
  21. }


 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --    In umbra igitur pugnabimus. --
mood
Publicité
Posté le 16-10-2014 à 15:09:01  profilanswer
 

n°2240784
coolkis
Posté le 20-10-2014 à 13:21:47  profilanswer
 

Ok, très bien merci ! Dès que je peux je testerais. Merci encore pour ton aide.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Recherche dans arborescence et exclure dossier

 

Sujets relatifs
[Trouvé] Recherche script Web FTP simpleInserrtion données et recherche de valeurs
[VBA] Recherche d'une valeur variable dans une autre feuille[Excel 2010] Formulaire de recherche multi-listbox
Renommer fichiers avec le nom de leurs dossierRecherche programmeur pour projet international
[DELPHI] Recherche les occurences de trois ou quatre lettres....Visual Studio : recherche des noms des composants utilisés dans un win
Symfony, faire un multi sélecte sur un champ de recherche[VBA] - fonction FIND associée à la recherche d'une date
Plus de sujets relatifs à : Recherche dans arborescence et exclure dossier


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR