Script affichage taille fichier

Script affichage taille fichier - Perl - Programmation

Marsh Posté le 26-08-2014 à 11:38:53    

Bonjour,
 
Je suis débutant en perl et je cherche à faire un script qui récupère les tailles en Ko de l'ensemble des fichiers d'un répertoire.
 
J'ai commencé à faire ceci :
 

Code :
  1. my $file = "C:\temp";
  2. my $taille = -s $file;
  3. print "$taille";


 
Mais cela ne m'affiche rien !
 
Est ce quelqu'un pourrait m'aider svp ?
Merci d'avance.

Reply

Marsh Posté le 26-08-2014 à 11:38:53   

Reply

Marsh Posté le 26-08-2014 à 14:13:21    

Si tu avais utilise les directives
use strict;
use warnings;
en tête de fichier, tu en aurais une idée.
 
"C:\temp"
on trouve un \t dans la chaine qui va être interprété comme un tab car c'est entre double quotes.
Il va falloir faire
'C:\temp'
avec des simples quotes, ou
"C:\\temp"
avec des doubles quotes et un \ doublé pour être interprété comme un \
 
Une fois ceci fait, tu vas avoir comme résultat 0...
 
Parce que si tu lis la doc, tu vois que quand on a un nom de répertoire, on ne peut pas l'utiliser directement avec les fonctions -s, -e, etc, contrairement aux noms de fichier.
Donc le test renvoie faux, ie 0.
La doc dit qu'il faut lui passer un dirhandle.
 
on le fait donc:
use strict;
use warnings;
 
my $file = 'C:\Temp';
opendir(my $dh, $file) || die "can't opendir $file: $!";
my $taille = -s $dh;
closedir($dh);
print $taille;
 
et la on a comme résultat  
> The dirfd function is unimplemented at dsiz.pl line 7.
 
Bref -s n'est pas implémentée pour renvoyer la taille des répertoires (au moins sous win32) et donc cette approche ne marche pas.
 
Donc on fait a la main le parcours récursif du répertoire et on incrémente la taille avec celle de chaque fichier trouvé:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
 
my $dir = 'C:\Temp';
my $size = 0;
find( sub { $size += -f $_ ? -s _ : 0 }, $dir );
print $size, "\n";
 
find (du module File::Find) fait ceci avec l'appel find( sub { $size += -f $_ ? -s _ : 0 }, $dir):
On part de $dir et on parcourt récursivement le répertoire.
Pour chaque fichier ou répertoire trouvé, on appelle sub { $size += -f $_ ? -s _ : 0 } dessus (le nom du fichier ou répertoire est passé dans la variable $_ par find)
-f $_ ? -s _ : 0, c'est la même chose que -f $_ ? -s $_ : 0, ça teste si on a un fichier (-f), si oui, ça renvoie sa taille (-s), et 0 sinon.
donc $size += -f $_ ? -s _ : 0 va ajouter la taille du fichier courant (si c'est un fichier) lors du parcours récursif
Et donc le tout somme les tailles de tous les fichiers rencontrés lors du parcours récursif.
 
Autre méthode, si on est sous Windows (et qu'on utilise pas le script sous un autre OS), utiliser le module Win32::DirSize
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-08-2014 à 14:38:07    

Merci beaucoup gilou pour cette réponse !
Effectivement après avoir posté j'ai utilisé "les directives" ! Ceci dit ce n'est pas si simple que ça (je commence aujourd'hui le perl).
 
Par contre j'aimerai comme résultat : une ligne (taille) par fichier trouvé et nom la somme des tailles de tous les fichiers.
 
J'ai essayé d'enlever le + dans $size += -f $_ ? -s _ : 0 mais sans résultat !
 
Je vais continuer de chercher en parallèle.

Reply

Marsh Posté le 26-08-2014 à 16:02:50    

C'est encore plus simple alors:
Pour chaque fichier rencontré lors du parcours récursif, on imprime la taille (et le nom dans mon exemple pour que ce soit plus lisible):
 
#!/usr/bin/perl  
use strict;  
use warnings;  
use File::Find;  
 
my $dir = 'C:\Temp';  
find( sub { print $_, " : ", -s $_, "\n" if -f $_ }, $dir );  
 
A+,

Reply

Marsh Posté le 26-08-2014 à 16:12:40    

Super, merci encore c'est exactement ce qu'il me fallait.

Reply

Marsh Posté le 26-08-2014 à 16:17:30    

Je te conseille de lire la doc de File::Find: http://perldoc.perl.org/File/Find.html
Cela te permettra d'affiner selon tes besoins le code.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-08-2014 à 16:21:06    

Oui merci c'est ce que j'étais en train de faire !
Par contre juste une petite remarque, le code affiche la taille en octet !
Est ce que je peux facilement faire des calculs pour transformer la taille en Ko ou il y a plus simple à faire dans la ligne de code ?

Reply

Marsh Posté le 26-08-2014 à 19:44:38    

Il suffit de faire le calcul:
 
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
 
my $dir = 'C:\Temp';
find( \&process, $dir );
 
sub process {
  if (-f $_) {
    my $size = -s _;
    # On arrondit au plus proche (on pourrait choisir un autre type d'arrondi).
    $size = int ( $size/1024 + 0.5 );
    print "$_ : ${size}k\n";
  }
}
 
A+,


Message édité par gilou le 26-08-2014 à 19:45:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-08-2014 à 10:56:30    

Merci gilou c'est parfait.

Reply

Marsh Posté le 27-08-2014 à 13:47:41    

Parfait ce Gilou :)
 
Tous les astuces donnees (et appronfondies) m'ont permis  
de decrocher un job en prog, ou le cpp est obligatoire mais aussi
ou le perl etait une competence supplementaire demandee...
 
La, je peux dire encore merci aussi :)
 
@+
Ju


---------------
Merci
Reply

Marsh Posté le 27-08-2014 à 13:47:41   

Reply

Marsh Posté le 27-08-2014 à 22:57:35    

   [:rougit]  
A+,


Message édité par gilou le 27-08-2014 à 22:57:53

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-08-2014 à 14:20:28    

---------------
A présidence nulle, croissance nulle. :wahoo:  
 
Pas mal :)


---------------
Merci
Reply

Sujets relatifs:

Leave a Replay

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