du.pl (disk usage )
simulare il programma linux du per verificare lo spazio utilizzato Questo programma simula il programma linux du ( disk usage ). per verificare lo spazio utilizzato da ciascun file di una directory Per le sottodirectory viene riportato lo spazio complessivo conteggiando tutti i file della sottodirectory ed il numero dei files contenuti in essa.

Esempio di utilizzo del programma:
[enzo@enzo6 varie]$ ./du.pl /usr_data/
pathname: /usr_data/
D: /usr_data//arabo                                   =     603.923.476 bytes ( 9 files )
D: /usr_data//VirtualBOX                              =   38111.339.529 bytes ( 28 files )
D: /usr_data//DOCUMENTAZIONE                          =    3775.787.453 bytes ( 73178 files )
D: /usr_data//DOWNLOAD                                =    6490.246.311 bytes ( 21636 files )
D: /usr_data//REPO-SVN                                =          45.010 bytes ( 45 files )
D: /usr_data//BUILD                                   =    2241.665.259 bytes ( 52037 files )
D: /usr_data//ACX100                                  =      33.719.116 bytes ( 560 files )
D: /usr_data//varie                                   =     418.051.497 bytes ( 23715 files )
F: /usr_data/fwbuilder.log.txt                        =          21.474 bytes
F: /usr_data/nodes.dat                                =           5.004 bytes
D: /usr_data/bck.kjots                                =       1.377.021 bytes ( 6 files )
F: /usr_data/myweb.2007.02.16.tar.gz                  =       2.492.457 bytes
F: /usr_data/setup.firewall                           =          19.634 bytes

Ovviamente il comando du ha poco senso in ambito linux in quanto esiste gia' la versione originale del programma. Windows non offre un tool analogo e con questo sistema operativo il progamma acquista anche un senso pratico.
C:\Documents and Settings\enzo.xxxx>C:\Programmi\du.pl
pathname: .
D: ./Cookies                                          =          33.014 bytes ( 2 files )
D: ./Dati applicazioni                                =       5.716.375 bytes ( 108 files )
D: ./Desktop                                          =           1.791 bytes ( 4 files )
D: ./Documenti                                        =       1.471.087 bytes ( 44 files )
D: ./Impostazioni locali                              =     554.005.473 bytes ( 424 files )
D: ./Menu Avvio                                       =          20.454 bytes ( 23 files )
D: ./Modelli                                          =          37.456 bytes ( 11 files )
F: ./NTUSER.DAT                                       =       2.621.440 bytes
F: ./ntuser.dat.LOG                                   =           1.024 bytes
F: ./ntuser.ini                                       =             194 bytes
F: ./ntuser.pol                                       =           1.286 bytes
D: ./Preferiti                                        =             122 bytes ( 0 files )
D: ./Recent                                           =          40.020 bytes ( 58 files )
F: ./regwizard.log                                    =           1.259 bytes
D: ./Risorse di rete                                  =             971 bytes ( 3 files )
D: ./Risorse di stampa                                =               0 bytes ( -1 files )
F: ./sanct.log                                        =           6.206 bytes
D: ./SendTo                                           =             179 bytes ( 5 files )
D: ./UserData                                         =          32.888 bytes ( 2 files )


   1    #!/bin/perl
   2    #
   3    # ----------------------------------------------
   4    # du.pl <path>
   5    # mostra i file e le directory figlie di <path>
   6    # e le loro dimensioni complessive
   7    # ----------------------------------------------
   8    
   9    =head1 programma du.pl
  10    
  11        program du.pl
  12        last update: 25/11/2007
  13    
  14    q
  15    
  16    =head2  descrizione
  17    
  18      mostra la dimensione di file e directory figlie della
  19      directory specificata come parametro
  20      Se il parametro passato e' nullo viene letta la directory corrente
  21    
  22    =head2  esempio di utilizzo
  23    
  24    [enzo@enzo6 ~]$  /home/enzo/workspace/perl_proj1/varie/du.pl  images
  25    
  26    pathname: images
  27    
  28    F: images/cattivone.gif                               =          80.853 bytes
  29    D: images/cartoons                                    =         846.934 bytes ( 8 files )
  30    D: images/pupe                                        =      19.179.907 bytes ( 49 files )
  31    D: images/paesaggi                                    =       8.188.511 bytes ( 41 files )
  32    D: images/battle                                      =       4.879.133 bytes ( 32 files )
  33    F: images/tiepolo_kruisdraging.jpg                    =          92.872 bytes
  34    F: images/linux-penguin-big_origpreview.jpg           =          22.351 bytes
  35    F: images/paura.gif                                   =          51.244 bytes
  36    D: images/soldatini                                   =         209.747 bytes ( 6 files )
  37    F: images/bush_yeo.jpg                                =         181.432 bytes
  38    D: images/tmp                                         =           9.439 bytes ( 3 files )
  39    F: images/Skeleton_1a_SDS_Test1.jpg                   =          78.277 bytes
  40    D: images/JanSaudek                                   =         549.765 bytes ( 19 files )
  41    D: images/games                                       =       3.469.065 bytes ( 10 files )
  42    F: images/tarantula.png                               =           4.163 bytes
  43    
  44    
  45    =cut
  46    
  47    use File::stat;
  48    
  49    my ( $pathname ) = $ARGV[0];
  50    
  51    if ( ! $pathname ) { $pathname = '.'; }
  52    
  53    print "pathname: $pathname \n";
  54    my @files = list_files( $pathname, 0 );
  55    
  56    foreach $f ( @files )
  57    {
  58        # per ogni file della lista iniziale
  59        # se file: viene indicata la dimensione del file
  60        # se directory: viene indicata la dimensione complessiva dei file contenuti
  61        if( -l $f )
  62        {
  63          # print " file($f) is a LINK --> SKIPPED \n";      
  64        }
  65        elsif( -d $f )
  66        {
  67           my @lsttmp = list_files( $f, 1 );
  68           my $isize = 0;
  69    
  70           # print "list_files( $f ) founded $#lsttmp files \n";
  71           
  72           for $ftmp ( @lsttmp )
  73           {
  74             $isize += file_size($ftmp);
  75           }
  76           printf( "D: %-50s = %-13s bytes ( %d files )\n", $f, fmt_size($isize), $#lsttmp  );
  77        }
  78        elsif( -f $f )
  79        {
  80            my $isize = file_size($f);
  81            printf( "F: %-50s = %-13s bytes \n", $f, fmt_size($isize) );
  82        }
  83    
  84    }
  85    
  86    
  87    
  88    ####################################################################
  89    
  90    # -------------------------------------------------------------
  91    # -------------------------------------------------------------
  92    sub fmt_size
  93    {
  94       my( $isize ) = @_;
  95       my( $m, $k, $u, $imod, $res, $strres );
  96    
  97       $m = int( $isize / 1000000 );
  98       $imod = $isize 1000000;
  99       $k = int( $imod / 1000 );
 100       $u = int( $imod 1000 );
 101       
 102       if( $m > 0 ) { $res = sprintf( "%3d.%03d.%03d", $m, $k, $u ); }
 103       elsif( $k > 0 ) { $res = sprintf( "%3d.%03d", $k, $u ); }
 104       elsif( $u > 0 ) { $res = sprintf( "%3d", $u ); }
 105       else { $res = "0"; }
 106       
 107       
 108       $strres = sprintf( "%15s", $res );
 109       return $strres;
 110    
 111    }
 112    
 113    # -------------------------------------------------------------
 114    # -------------------------------------------------------------
 115    sub file_size
 116    {
 117       my( $fname ) = @_;
 118       my ( $fsize, $sb );
 119            
 120       # print "[file_size] START on file ($fname) \n";
 121            
 122       if( -d $fname ) 
 123       { 
 124          $fsize = 0; 
 125       }
 126       else
 127       {
 128          $sb = stat($fname);
 129          if( ! defined $sb )
 130          {
 131             print "[file_size] stat($fname) in UNDEF  \n\n";
 132             $fsize = 0;
 133          }
 134          else
 135          {
 136              $fsize = $sb->size;
 137          }           
 138       }
 139       
 140       
 141       # print "[file_size] END on file ($fname) (size=$fsize)\n";
 142       return $fsize;
 143    }
 144    
 145    # -------------------------------------------------------------
 146    # mode=0 : ritorna la lista dei file e dir contenuti della dir
 147    # mode=1 : ritorna anche i file delle eventuali sottodirectory
 148    # -------------------------------------------------------------
 149    sub list_files
 150    {
 151       my( $pathname, $mode ) = @_;
 152       my( @atmp, @lstfiles, $f );
 153       
 154       # print "list_files: pathname: $pathname \n";
 155       
 156       if( -l $pathname )
 157       {
 158          # print "[list_files] pathname: $pathname is a LINK -> SKIPPED \n";
 159          return @lstfiles;
 160       }
 161       
 162       opendir( D, $pathname ) or warn "Can t open dir $pathname -> $! ";
 163       @atmp = readdir(D);
 164       
 165       @lstfiles = ();
 166       foreach $f ( @atmp )
 167       {
 168          if ( $f eq '.' ) { next; }
 169          if ( $f eq '..' ) { next; }
 170          if ( $f eq '/' ) { next; }
 171          
 172          if( $pathname eq '.' )
 173          {
 174             $f = './' . $f;
 175          }
 176          else
 177          {
 178             $f = $pathname . '/' . $f;
 179          }
 180          
 181          if( $mode == 0 )
 182          {
 183            push @lstfiles, $f;
 184          }
 185          else
 186          {
 187             if ( -d $f )
 188             {
 189               my @lfiles = list_files( $f, 1 );
 190               push @lstfiles, @lfiles;
 191               my $n1 = scalar @lfiles;
 192               my $n2 = scalar @lstfiles;
 193             }
 194             else
 195             {
 196               push @lstfiles, $f;
 197             }
 198          }
 199       }
 200    
 201      closedir D;
 202      return @lstfiles;
 203    }