Recherche dans arborescence et exclure dossier

Recherche dans arborescence et exclure dossier - Perl - Programmation

Marsh Posté le 10-10-2014 à 15:44:11    

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.

Reply

Marsh Posté le 10-10-2014 à 15:44:11   

Reply

Marsh Posté le 10-10-2014 à 17:42:56    

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!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-10-2014 à 17:02:52    

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

Reply

Marsh Posté le 13-10-2014 à 18:07:34    

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!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-10-2014 à 18:17:08    

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 ?

Reply

Marsh Posté le 15-10-2014 à 20:13:30    

> 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!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-10-2014 à 12:41:43    

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.

Reply

Marsh Posté le 16-10-2014 à 12:48:19    

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!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-10-2014 à 14:14:26    

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

Reply

Marsh Posté le 16-10-2014 à 15:09:01    

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!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-10-2014 à 15:09:01   

Reply

Marsh Posté le 20-10-2014 à 13:21:47    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed