IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Chercher certains fichiers dans différents répertoires


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut Chercher certains fichiers dans différents répertoires
    Bonsoir tout le monde,

    J'explique mon problème :
    J'ai plusieurs fichiers dans différents répertoires, j'aimerais rassembler l'ensemble de ces fichiers dans un seul car ils possèdent les mêmes informations.

    En fait, l'arborescence est + ou - comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    OMC
          BSC1
               BTS1.1
                    22012009
                         fichier1.txt
                         fichier2.txt
                         .
                         .
                         .
                         fichier24.txt
               BTS1.2
                    22012009
                         fichier1.txt
                         fichier2.txt
                         .
                         .
                         .
                         fichier24.txt
          BSC2
               BTS2.1
                    22012009
                         fichier1.txt
                         fichier2.txt
                         .
                         .
                         .
                         fichier24.txt
               BTS2.2
                    22012009
                         fichier1.txt
                         fichier2.txt
                         .
                         .
                         .
                         fichier24.txt
               BTS2.3
                    22012009
                         fichier1.txt
                         fichier2.txt
                         .
                         .
                         .
                         fichier24.txt
          BSC3
               BTS3.3
                    22012009
                         fichier1.txt
                         fichier2.txt
                         .
                         .
                         .
                         fichier24.txt
    Donc, je veux récupérer les 24 fichiers de chaque BTS dans un seul, je rajouterai bien sur dans les fichiers une colonne pour différencier les BTS.

    J'ai un problème pour connaitre le chemin du fichier que je pointe et puis un résultat NUL . Mon problème pour l'instant est comment mettre tous ces fichiers dans un seul et sachant qu'ils sont éparpillés dans différents dossiers, voici ce que j'ai essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #!/usr/ bin/perl
     
    opendir (DIR,".") || die ('Erreur Open Dir');         #mon script est dans le répretoire OMC
    @fic = readdir(DIR);
    foreach (@fic)
    {
      $c=$_;
     
      if (-d $c)
        {
     
          chdir ("BSC1/$c");                       #ici, c'est zéro pointé, je n'arrive pas à connaitre le chemin du fichier pointé
          print("$c\n"); 
     
        }
    }
     
    opendir (DIR,".") || die ('Erreur Open Dir');
    @fic1 = readdir(DIR);
    foreach (@fic1)
    {
     
      $c1=$_;
     
      if (-d $c1)
        {
          print("$c1\n");
     
     
     
        }
    }
    Résultat des courses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    .
    ..
    .
    ..
    BTS1.1
    BTS1.2
    BTS1.3
    Je me rends bien compte que ce n'est pas la bonne solution, c'est pour cette raison que je demande votre aide.

    Merci de m'aider.

    Salutations.

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Dans le dossier OMC as-tu d'autres dossiers que les BTS que tu ne devrais pas récupérer? Dans les dossiers BTS n'as-tu que le dossier 22012009?

    Autrement dit, dois-tu récupérer tous les fichiers contenus dans le dossier OMC et ses sous dossiers ou y a-t'il un tri à effectuer?

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Pour ce qui est de ton script

    Tu devrais utiliser les pragma strict et warnings

    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    opendir (DIR,".") || die ('Erreur Open Dir');         #mon script est dans le répretoire OMC
    @fic = readdir(DIR);
    Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    opendir DIR,"." || die ('Erreur Open Dir');         
    my @dir1 = grep{$_ !~ /^\.\.?$/}readdir(DIR);
    closedir DIR;
    ... n'oublie pas le closedir, c'est plus propre




    Pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach (@fic)
    {
      $c=$_;
    Fais plutôt :
    Au final si tu veux parcourir palier par palier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/ bin/perl
     
    use strict;
    use warnings;
     
     
    opendir DIR,"." || die ('Erreur Open Dir');         
    my @dir1 = grep{$_ !~ /^\.\.?$/}readdir(DIR);
    closedir DIR;
     
     
    foreach my $c (@dir1)		# BMC1, BMC2 ....
    {	
    	if ( (-d $c) && ($c =~ /BSC/) )
    	{
    		opendir DIR, "$c/22012009" || die ('Erreur Open Dir');         #mon script est dans le répretoire OMC
    		my @dir2 = grep{$_ !~ /^\.\.?$/}readdir(DIR);
    		closedir DIR;	
     
    		foreach my $d (@dir2)	# 22012009
    		{	
    			if (-e $d)
    			{
    				print $d."\n";
    			}
    		}
    	}
    }
    ... voila comment tu aurais pu te débloquer


    ... mais il y a beaucoup plus simple. Tu peux utiliser la fonction récursive que Djibril m'a passée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #!/usr/ bin/perl
     
    use strict;
    use warnings;
     
     
     
    sub lister_repertoires_recursif {
      unless( scalar(@_) == 1) {
        my $usage = <<'FIN_USAGE';
        Usage: lister_repertoires_recursif($repertoire);
    FIN_USAGE
        croak($usage);
       }
     
      my ($repertoire) = @_;
        opendir (REP, $repertoire) or
          die "impossible d'ouvrir le repertoire $repertoire\n";
        # récupérations de tous sauf . et ..
        my @file_rep = grep { !/^\.\.?$/ } readdir(REP);
        closedir (REP);
        my @repertoires = ();
        foreach my $nom (@file_rep) {
            # si $repertoire/$nom est un répertoire
            if ( -d "$repertoire/$nom") {
              push (@repertoires, "$repertoire/$nom");
              # on appel la fonction sur l'ensemble des dossiers contenus dans @repertoires
              push (@repertoires, &lister_repertoires_recursif("$repertoire/$nom"));
            }
        }
        return @repertoires;
    }
     
     
     
    my @repertoires = lister_repertoires_recursif('.'); 
     
    foreach my $path (@repertoires){
     
    	if ($path =~ m{/BSC\d+/BTS\d+\.\d+/22012009}){
    		opendir DIR, $path || die ('Erreur Open Dir');         #mon script est dans le répretoire OMC
    		my @dir = grep{$_ !~ /^\.\.?$/}readdir(DIR);
    		closedir DIR;	
     
    		foreach my $file (@dir){
    			print $file."\n";
    			# par exemple module : File::Copy 		fonction : move $file
    		}
    	}	
    }

    si comme tu le mets dans l'intro, ton chemin vers test fichier est + ou - ça ... mon expression régulière de contrôle est + ou - bonne

  4. #4
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2007
    Messages : 148
    Points : 83
    Points
    83
    Par défaut
    Salut Jasmine,

    Merci pour votre réponde . En fait, je préfère de loin la première proposition puisque je l'ai bien comprise , maintenant tout marche nickel.

    Merci Jasmine.

    Salutations.

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Hoopsy Voir le message
    Salut Jasmine,

    Merci pour votre réponde . En fait, je préfère de loin la première proposition puisque je l'ai bien comprise , maintenant tout marche nickel.

    Merci Jasmine.

    Salutations.

    N'hésite pas à poser des questions sur ce que tu ne comprends pas, le forum est là pour ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Copier X Fichiers dans différents répertoires
    Par bixouille dans le forum Scripts/Batch
    Réponses: 13
    Dernier message: 12/05/2015, 18h56
  2. Réponses: 4
    Dernier message: 28/12/2009, 16h55
  3. Stocker ses fichiers dans différents répertoires
    Par dtthierry dans le forum Langage
    Réponses: 1
    Dernier message: 22/09/2008, 17h05
  4. Taille total de certains fichiers dans un répertoire ?
    Par byloute dans le forum Administration système
    Réponses: 4
    Dernier message: 01/04/2008, 18h12
  5. Réponses: 4
    Dernier message: 21/08/2007, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo