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 :

perl, compter le nombre de fichier dans un répertoire


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut perl, compter le nombre de fichier dans un répertoire
    Bonjour à tous,
    Voilà j'aimerai connaitre une commande, pour un script perl, qui compterai le nombre de fichier dans un répertoire donné. En fait le but de ceci est de pouvoir compter le nombre de compter le nombre de fichier, si ce nombre est égale à 4, supprimer plus ancien. Merci beaucoup à ceux qui voudront bien m'aider
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Tu peux proceder differemment si ton but est de supprimer les plus ancien.
    Tu peux essayer de voir la date de modification de tous les fichiers de ton repertoire et tu le compare à ta date (Confere dans notre belle FAQ ). Ensuite tu supprimes les anciens.

    Sinon veux tu lister les fichiers dans un repertoire recursivement ou non?

  3. #3
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Oui mais le but c'est de garder les 3 fichiers les plus récents. Donc du coup, j'ai réussi à compter le nombre de fichier dans un répertoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $a = `ls /users/admplat/test/ | grep $output_fn | wc -l`;
    Maintenant je voudrais savoir comment pouvoir supprimer le plus ancien. Une idée ?
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par griese
    Oui mais le but c'est de garder les 3 fichiers les plus récents. Donc du coup, j'ai réussi à compter le nombre de fichier dans un répertoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $a = `ls /users/admplat/test/ | grep $output_fn | wc -l`;
    Maintenant je voudrais savoir comment pouvoir supprimer le plus ancien. Une idée ?
    Oui : éviter de faire du bash en Perl...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #! /usr/bin/perl
    use strict; use warnings;
     
    my $path = '/users/admplat/test'
    opendir my($dir), $path;
    my @files = readdir $dir;
    if( @files > 3 ){
      @files = sort {-M "$path/$a" <=> -M "$path/$b"} @files;
      for my $file ( @files[3..$#files] ){
        unlink "$path/$file";
      }
    }
    Ou un truc comme ça...

    --
    Jedaï

  5. #5
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Merci de ton aide Jedai mais haurais tu la gentillesse de m'expliquer ton code ? Je n'y connais pas grand chose en perl donc une ou deux petites explications serait les bienvenus. Encore merci à toi
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  6. #6
    tfe
    tfe est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 85
    Points : 95
    Points
    95
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #! /usr/bin/perl
    use strict; use warnings;
     
    my $path = '/users/admplat/test'
    opendir my($dir), $path;
    my @files = grep {! /^\.\.?$/ } , readdir $dir;
    if( @files > 3 ){
      @files = sort {-M "$path/$a" <=> -M "$path/$b"} @files;
      for my $file ( @files[3..$#files] ){
        unlink "$path/$file";
      }
    }
    opendir va ouvrir le repertoire . #La variable $dir sera alors la reference vers le dossier.
    my @files = grep {! /^\.\.?$/ } , readdir $dir; #va lire l'ensemble du repertoire et va le mettre dans le tableau @files.
    if(@files > 3) { : #si il y a plus de 3 fichiers dans le dossier, (Les fichiers "." et ".." exclus, on trie.

    sort{} @files #va trier le tableau @files
    for my $file ( @files[3..$#files] ){ # pour chaque element du tableau (a partir du 3eme au dernier)
    unlink "$path/$file"; #( on supprime l'element )
    }

  7. #7
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par griese
    Merci de ton aide Jedai mais haurais tu la gentillesse de m'expliquer ton code ? Je n'y connais pas grand chose en perl donc une ou deux petites explications serait les bienvenus. Encore merci à toi
    On est là pour ça ! (Encore que je trouve qu'on apprend beaucoup en s'efforçant de comprendre un code écrit par un programmeur plus expérimenté que soi dans un langage donné)

    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
    #! /usr/bin/perl
    use strict; use warnings;
     
    my $path = '/users/admplat/test'
     
    # ouvre le répertoire '/users/admplat/test' dans la variable lexicale $dir
    opendir my($dir), $path;
     
    # lit la liste des noms des fichiers dans $dir et la place dans le tableau 
    # @files, le grep que j'avais oublié est là pour ne garder que les noms 
    # de _fichiers_ et pas de répertoires (ou autres bizarreries)
    my @files = grep { -f "$path/$_" } readdir $dir;
     
    # s'il y a plus de 3 fichiers dans cette liste
    if( @files > 3 ){
      # trie les noms de fichiers par ancienneté croissante
      @files = sort {-M "$path/$a" <=> -M "$path/$b"} @files;
     
      # pour tous les fichiers de la listes sauf les trois premiers 
      # (aux index 0, 1 et 2)
      for my $file ( @files[3..$#files] ){
        # supprime le fichier
        unlink "$path/$file";
      }
    }
     
    # ferme le répertoire $dir (automatique quand le script finit, mais 
    # tant qu'à être propre !)
    closedir $dir;
    Je t'invite à consulter la documentation des fonctions my(), opendir()/readdir()/closedir(), grep(), unlink() et sort() pour plus de détails. (selon ton système, il te suffit de taper 'perldoc -f nomdefonction' pour la trouver, sinon installe perldoc ou regarde sur le net).

    --
    Jedaï

  8. #8
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Merci à vous, et avec les explications c'est nickel. J'ai testé le script et ca marche. Par contre j'essai de modifier le grep car dans mon répertoire test, j'ai d'autres fichiers qui ne sont pas concerné pas mon script. Tous les fichiers qui doivent être traité commence par suivi_3.8 et donc j'essai de modifier le grep en lisant la doc sur le net mais sans résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = grep { -f "/^suivi_3.8/","$path/$_" } readdir $dir;
    Si vous voyez le souci n'hésitez pas
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par griese
    Merci à vous, et avec les explications c'est nickel. J'ai testé le script et ca marche. Par contre j'essai de modifier le grep car dans mon répertoire test, j'ai d'autres fichiers qui ne sont pas concerné pas mon script. Tous les fichiers qui doivent être traité commence par suivi_3.8 et donc j'essai de modifier le grep en lisant la doc sur le net mais sans résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = grep { -f "/^suivi_3.8/","$path/$_" } readdir $dir;
    Si vous voyez le souci n'hésitez pas
    Autre fonction à étudier "-X" autrement dit les test de fichier.
    -f en fait partie et teste si le chemin qui suit est celui d'un fichier normal.
    essaie de mieux comprendre comment grep() fonctionne aussi.

    La solution dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = grep { -f "$path/$_" and m/^suivi_3.8/ } readdir $dir;
    --
    Jedaï

  10. #10
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    J'essai de trouver des infos sur le net mais impossible de trouver ce que font les fonctions -X et autres. Tout ce que je trouve sur grep n'est pas très détaillé. Quelqu'un aurait-il un lien à me donner ? Sinon, Jedaï, pour ta commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = grep { -f "$path/$_" and m/^suivi_3.8/ } readdir $dir;
    Il y a une erreur de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "my" variable @files masks earlier declaration in same scope at ./test_script_perl.pl line 9.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  11. #11
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Autant pour moi . J'ai trouvé l'erreur, je déclarais la variable @files juste au dessus. C'est règlé. Je test mon scrpit pour voir si il fonctionne comme il faut
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  12. #12
    tfe
    tfe est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 85
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par griese
    J'essai de trouver des infos sur le net mais impossible de trouver ce que font les fonctions -X et autres. Tout ce que je trouve sur grep n'est pas très détaillé. Quelqu'un aurait-il un lien à me donner ? Sinon, Jedaï, pour ta commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = grep { -f "$path/$_" and m/^suivi_3.8/ } readdir $dir;
    Il y a une erreur de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "my" variable @files masks earlier declaration in same scope at ./test_script_perl.pl line 9.
    Je trouve ca bebe de tester l existance d un fichier alors qu il est trouve avec un readdir (non?)

  13. #13
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Par contre, j'ai l'impression que le script ne rentre pas dans la boucle for. Pourriez-vous m'expliquer l'utilisation des variables $a et $b qui sont déclarées nulle part ? encore merci à vous
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  14. #14
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    Ne fait c'est mon grep qui pause souci, j'arrive pas à juste sélectionner les fichiers commencant par suivi_3.8. Je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = `ls "${path}/"*suivi_3.8*`;
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  15. #15
    Membre actif Avatar de griese
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    646
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 646
    Points : 281
    Points
    281
    Par défaut
    J'ai re testé cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @files = grep { -f "$path/$_" and m/^suivi_3.8/ } readdir $dir;
    Et ça marche nickel, merci à vous pour aide et votre patience. Vous m'avez un fier service. Encore merci
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.

    http://mosfootball.over-blog.com

  16. #16
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par tfe
    Je trouve ca bebe de tester l existance d un fichier alors qu il est trouve avec un readdir (non?)
    Peut-être devrais-tu également réviser les tests de fichier ?
    -e teste l'existence d'un fichier, mais -f vérifie s'il s'agit d'un fichier normal (pas un répertoire, un pipe ou autres...)

    --
    Jedaï

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par djibril Voir le message
    Tu peux proceder differemment si ton but est de supprimer les plus ancien.
    Tu peux essayer de voir la date de modification de tous les fichiers de ton repertoire et tu le compare à ta date (Confere dans notre belle FAQ ). Ensuite tu supprimes les anciens.

    Sinon veux tu lister les fichiers dans un repertoire recursivement ou non?
    Bonjour,

    Moi je veux compter récursivement le nombre de fichiers dans un répertoire
    Merci d'avance

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/06/2009, 18h41
  2. compter le nombre de fichier dans un répertoire
    Par fireit dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 27/03/2009, 20h15
  3. Réponses: 1
    Dernier message: 19/06/2008, 17h28
  4. Réponses: 1
    Dernier message: 30/10/2007, 00h07
  5. compter le nombre de fichiers dans un répertoire !
    Par lehic dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 20/11/2005, 17h59

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