Determiner quota disk user && taille totale du répertoire de user

Determiner quota disk user && taille totale du répertoire de user - Perl - Programmation

Marsh Posté le 03-05-2004 à 16:39:52    

Bonjour,
 
1--> J'aimerai savoir s'il existe un moyen en perl de déterminer le quota disk d'un utilisateur (on connait le nom de l'utilisateur, iud, adresse repertoire perso).
commande sous unix équivalente :  
  quota nomUser
 
J'ai testé les commandes ci dessous, mais le résultat=256 :
  my $quotaUser = system ("quota -Q".$NomUser);
OU
  my @quotaUser = system ("quota -Q".$NomUser);
 
________________________
________________________
2--> Autrement j'aimerai connaître un moyen qui permet de définir la taille totale d'un répertoire (composé de fichiers, de sous répertoires, sous-sous répertoires...)
 
* J'ai testé la commande :
     use File::stat;
     my $sizeFile = stat($Chemin/$repertoire);
     ->Cette commande ne doit servir uniquement pour connaître la taille d'un fichier et non d'un dossier ??
     -> Résultat :: 4096 (équivaut ls -lsh sous unix - 4096blocks nécessaire pour stocker info sur le dossier lui même - <i>nom-emplacement-...</i>
 
 
* J'ai testé la commande ci dessous:
      my $sizeFile = system ("du -lsh ".$Répertoire);
      ->Résultat quel que soit l'utlisateur et la taille du répertoire :: 256  
      ->J'aurai voulu obtenir l'équivalent de la commande "du -lsh" sous unix
 
* J'ai testé la solution donnée dans le forum - perl -page6; mais ça fonctionne pas!!
 
Code :

Citation :


  opendir(DIR, ${path_perso}/$name) or die "impossible d'ouvire $name: $!";  
  my $taillef = 0;  
  while (defined($file = readdir(DIR))) {  
        if ($file !~ /^\.\.?$/) {  
              # pas '..' et '.'  
              $taillef += (stat $file)[7];  
        }  
  }  
  closedir(DIR);  
  print $taillef;  


 
 
DONC EN RESUME ::
si vous connaissez les équivalences des commandes unix 'quota userName' ET 'du -lsh Chemin/Répertoire' pour PERL
Merci de bien vouloir me répondre.

 
Merci par avance.

Reply

Marsh Posté le 03-05-2004 à 16:39:52   

Reply

Marsh Posté le 03-05-2004 à 17:19:45    

1- system ne retourne rien pas la sortie d'un commande:
[quote=http://www.perl-gratuit.com/traduction/docfr/perlfunc.html#item_system]
La valeur retournée est le statut de sortie (exit status) du programme tel que retourné par l'appel wait(). Pour obtenir la valeur réelle de sortie, il faut le diviser par 256. Voir aussi exec. Ce n'est PAS ce qu'il faut utiliser pour capturer la sortie d'une commande. Pour cela regarder les apostrophes inversées (backticks) ou qx// comme décrit dans `CHAINE` in the perlop manpage.[/quote]
De plus l'option -Q moi connait pas...
 
2- idem pour system, mais tu dois avoir un module dans cpan tout fait, sinon rien ne t'empeche de faire une fonction dans le genre:

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my $dir='/home/';
  4. print repSize($dir,0)."\n";
  5. exit;
  6. sub repSize
  7. {
  8. my $currentdir = shift;
  9. my $currentsize = shift;
  10. opendir(D,$currentdir) or die "Can't open $currentdir: $!\n";
  11. my @files=readdir(D);
  12. close(D);
  13. for(@files)
  14. {
  15.   if (-d "$currentdir/$_" && $_ ne '.' && $_ ne '..')
  16.   {
  17.     $currentsize+=repSize("$currentdir/$_", $currentsize);
  18.   }
  19.   else
  20.   {
  21.     $currentsize+=(-s "$currentdir/$_" );
  22.   }
  23. }
  24. return $currentsize;
  25. }


attention, le resultat doit être à diviser par 8 si tu le veux en octets!


Message édité par anapajari le 03-05-2004 à 17:21:58
Reply

Marsh Posté le 05-05-2004 à 11:01:21    

J'ai compris d'où venait l'erreur. Dans la ligne :

Citation :

$du = `du -lsh `.$RepUser;


Je n'intégrais pas le chemin du 'répertoire utilisateur' dans les backticks(``), donc la commande retournait la taille disque utilisée par le répertoire courrant (CàD répertoire où est stocké mon fichier .pl), d’où l’affichage récursif de 96k qelq soit le répertoire utilisateur.
 
Par contre, si je fais:

Citation :

$du = `du -lsh $RepUser`;


Aucune valeur n'est retournée, car "Permission denied". En effet, sous Unix j'effectue la commande "du -lsh Répertoire" avec "root", car avec les autres login je n’ai pas la permission.
 
D'où ma question : comment pourrais-je résoudre ce pb de permission, pour pouvoir effectuer la commande "du -lsh" dans mon fichier .pl ?
 
Merci par avance.


Message édité par ml01 le 06-05-2004 à 09:36:38
Reply

Sujets relatifs:

Leave a Replay

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