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

Programmation et administration système Perl Discussion :

Récupérer la taille des répertoires


Sujet :

Programmation et administration système Perl

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut Récupérer la taille des répertoires
    Bonjour,

    J'ai besoin de récupérer la taille de plusieurs répertoires sur différents serveurs windows 2003.

    Je débute sous Perl.
    J'ai dans un premier temps fait un script qui exécutait en local le binaire du.exe :
    my $ST = `psexec \\\\172.x.x.x\\ du -sm D:\\Partage`;

    Sur des répertoires de quelques giga c'est rapide, mais sur des répertoires de plusieurs centaines de giga c'est interminable.

    Je cherche donc une autre solution plus rapide, peut être existe t'il un module?

    En vous remerciant par avance.

  2. #2
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Bonjour, j'ai avancé mais maintenant je suis bloqué sur la récursivité:
    #!/usr/bin/perl

    use warnings;

    ##Définitions des variables ""
    my $dir = "C:\\Outils";
    my $dossier = "";
    my $fichier = "";
    my $file = "";
    my $compteur1 = 0;
    my $compteur2 = 0;
    my $total = 0;

    foreach $file (grep { -f } glob "$dir/*")
    {
    print ("$file a une taille de ", -s $file, " octets \n");
    $compteur1 = $compteur1 + -s $file;
    }

    foreach $dossier (grep { -d } glob "$dir/*")
    {
    foreach $fichier (glob "$dossier/*")
    {
    print ("$fichier a une taille de ", -s $fichier, " octets \n");
    $compteur2 = $compteur2 + -s $fichier;
    }
    }

    $total = (($compteur1 + $compteur2)/1024)/1024;
    print ("$dir fait $total Mo \n");
    C'est une partie de script que j'ai récupéré et modifier.
    Donc là je cherche comment rendre la fonction glob récursive.

  3. #3
    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 : 499 184
    Points
    499 184
    Par défaut
    Bon, Une façon simple de calculer la taille d'un répertoire en Perl est d'utiliser le module suivant : Filesys::DiskUsage

    Installe le et pour l'utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Carp;
     
    use Filesys::DiskUsage qw/du/;
     
    my $Size = du("C:/");
    voilà

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Super merci.

    Je test dès que j'ai compris comment installer le module... (si si j'ai lu la faq).

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé la version zip ici:
    http://ppm.activestate.com/PPMPackag...-only/Windows/

    Avec le .ppd qui va bien du coup ça va beaucoup mieux pour l'installation, je pourrai tester demain.

    Bonne soirée

  6. #6
    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 : 499 184
    Points
    499 184
    Par défaut
    Pour installer, t'as juste à faire ceci sous dos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ppm install Filesys::DiskUsage

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé rapidement sur un dossier en local et ça fonctionne.

    Reste à tester sur le dossier d'un serveur distant et faire le script complet.

    Je poste quand c'est fini ou si j'ai un problème.

    Encore merci.

    EDIT: j'avais essayé cette commande, ça ne passait pas le proxy avec login et mdp (malgré avoir spécifier tout ce qui fallait en suivant la FAQ)

  8. #8
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Pour ma deuxième partie de script j'ai besoin d'un module ou d'une commande pour remplacer mon binaire LS.EXE.

    J'ai besoin de compter le nombre de dossier contenu dans un dossier spécifique.

    Une idée?

  9. #9
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    J'ai tenté comme ceci:

    foreach $file (grep { -d } glob "$dir/*")
    {
    $i++;
    }
    Ca fonctionne en local mais quand $dir pointe sur le répertoire d'une machine distante ça me renvois 0.

  10. #10
    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 : 499 184
    Points
    499 184
    Par défaut
    $dir = ?
    donne un exemple

  11. #11
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Je suis tombé sur ça:

    my ($nbrep, $nbfic, $fichier, $dossier) = (0, 0, undef, '/home/gldavid/perl');
    opendir (my $dir, $dossier) or die "$dossier n'existe pas !";
    my @files = readdir $dir;
    foreach $fichier (@files)
    {
    $nbfic++ if (-f "$dossier/$fichier");
    $nbrep++ if (-d "$dossier/$fichier");
    }
    closedir $dir;
    print "Il y a $nbfic fichier(s) et $nbrep répertoire(s) dans $dossier.\n";
    Ca fonctionne : ) (mais il ya a des notions que je ne connais pas encore).

    Sinon voici un exemple de $dir:
    my $dir = "\\\\monserveur.mondomaine.com\\c\$\\homedirs";

  12. #12
    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 : 499 184
    Points
    499 184
    Par défaut
    utilise toujours cette ecriture à la linux avec des / au lieu des \ pour les chemins.
    Perl les comprends et ça fonctionne mieux.
    Exemple pour ton cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $dir = "//monserveur.mondomaine.com/c/homedirs";

  13. #13
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Effectivement avec cette notation ça passe (merci!).

    J'ai cependant un autre "problème", voila le script (qui n'est pas fini):

    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
    #!/usr/bin/perl
     
    ## Prés-requis ##
    	#Module: Filesys::DiskUsage#
     
    ## Chargement des modules ou fonctions ##
    use strict;
    use warnings;
    use Carp;
    use Filesys::DiskUsage qw/du/;
     
    ## Définition des variables ##
    my $dir = "//mamachine.mondomaine.com/d\$/homedirs";
    my ($i, $f, $size, $file) = (0, 0, 0, 0, "");
     
    ## Traitement ##
    $size = du ($dir);
    $f = ($size/1024)/1024;
     
    foreach $file (grep { -d } glob "$dir/*")
    {
    $i++;
    }
     
    ## Edition ##
    print ("Il y a $i homedirs dans $dir pour un total de $f Mo. \n");

    L'exécution est très, très longue dès que je suis sur une machine distante.
    Comment cela se fait-il!? Je pensais que le du était fait en local puis le résultat renvoyé sur ma machine, ce n'est pas ça?
    (bientôt 15 minutes que le script tourne sur un dossier de 2Go!!)

  14. #14
    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 nefast Voir le message
    L'exécution est très, très longue dès que je suis sur une machine distante.
    Comment cela se fait-il!? Je pensais que le du était fait en local puis le résultat renvoyé sur ma machine, ce n'est pas ça?
    Non, du() est une fonction Perl, elle s'exécute sur ta machine et demande la taille de chaque fichier sur le réseau...
    Vu ce que du() peut faire, il n'y a pas vraiment le choix, mais pour ton besoin en particulier il y a peut-être moyen de faire mieux : essaye d'utiliser getFileSize() de Win32API::File pour voir, il est possible que cela fonctionne sur un répertoire comme tu le souhaites et soit plus rapide.

    --
    Jedaï

  15. #15
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Très bien,

    Merci Jedai, je test dès que j'ai le temps.

  16. #16
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Je n'arrive pas à utiliser correctement la fonction:

    use Win32API::File 0.1001 qw( :ALL );
    $size = getFileSize ($dir);

    Mais il est pas content et me renvois:
    Match::BigInt: couldn't load specified math lib(s), fallback to Math::BigInt::FastCalc at C:/Perl/site/lib/Win32API/File.pm line 20

    Il me renvois tout de même un résultat qui n'est pas bon.

  17. #17
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Et pour infos les serveurs sont en prod et perl n'est pas installé dessus, donc pas possible d'exécuter un script directement sur un serveur.

  18. #18
    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 : 499 184
    Points
    499 184
    Par défaut
    Ouais, il me retourne tout le temps 4294967295, soit 3Go

  19. #19
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Arf

  20. #20
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 2
    Points
    2
    Par défaut
    Personne n'a de solution?

    Je vais devoir faire mon script en C? (faute de pouvoir installer perl sur les serveurs)

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/05/2015, 20h06
  2. Réponses: 7
    Dernier message: 26/05/2007, 12h43
  3. Taille des répertoires et sous répertoires
    Par Katyucha dans le forum Windows XP
    Réponses: 4
    Dernier message: 24/08/2006, 16h28
  4. Récupérer la liste des répertoires d'un répertoire
    Par oursblanc dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2005, 14h36

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