2010-07-19 11 views
0

Je suis en train de scanner un système de fichiers et je souhaite déterminer la taille allouée d'un fichier sur le disque.Comment puis-je déterminer la taille réelle du fichier sur disque en utilisant Perl?

En utilisant stat() je peux obtenir la taille du fichier en tant que (stat(_))[7], les blocs alloués sur le disque peuvent être obtenus à partir (stat(_))[12], et la « taille de bloc le plus pratique pour le système de fichiers I/O » est (stat(_))[11].

Si je ne fais que multiplier les colonnes 11 et 12, je n'ai pas ce qui semble être l'espace alloué sur le disque (sous Solaris 5.10 sparc).

Comment puis-je obtenir par programme l'espace alloué sur le disque pour un fichier de l'appel de la fonction stat() en Perl?

Répondre

2

La valeur exposée dans (stat _)[11] est st_blksize, qui est documented comme

une indication quant à la taille du bloc "meilleur" pour les opérations d'E/S. Ce champ n'est pas défini pour les fichiers spéciaux de blocs ou de caractères spéciaux.

Ce n'est pas nécessairement la taille du bloc du système de fichiers particulier sur lequel votre fichier réside, mais la même page de manuel contient une définition pratique:

blkcnt_t st_blocks; /* Number of 512 byte blocks allocated*/ 

Donc, vous pouvez utiliser un code tel comme

#! /usr/bin/perl 

use warnings; 
use strict; 

sub usage { "Usage: $0 file ..\n" } 

die usage unless @ARGV; 

foreach my $file (@ARGV) { 
    my $dir = dirname $file; 

    my $blocks = (stat $file)[12]; 
    unless (defined $blocks) { 
    warn "$0: stat $file: $!\n"; 
    next; 
    } 

    print "$file - ", $blocks * 512, "\n"; 
} 

Si vous craignez que la taille des blocs de vos systèmes de fichiers ne sont pas des multiples de 512, d ouble vérification soit

df -g <directory>

ou si vous avez racine

fstyp -v /dev/dsk/...

Pour un fichier ordinaire, la taille du fichier lui-même, -à-dire, (stat _)[7], est généralement plus petite que la taille totale de tous les blocs alloués car les systèmes de fichiers allouent des blocs entiers.

2

Est-ce sur un système de fichiers ZFS? Je ne sais pas comment il interagirait avec l'appel de fonction de stat de Perl, mais il existe normalement une disparité entre la taille réelle d'un fichier et ce qui est rapporté sur le disque dans ZFS, variant en fonction des métadonnées et de la compression. Par la documentation dans perldoc -f stat je ne vois pas assez d'informations pourraient être extraites de stat de Perl pour deviner ce qui est réellement sur le disque dans le cas unique de ZFS. Si tout le reste échoue et vous avez besoin de savoir à tout prix ce qui est réellement sur le disque, comme un dernier recours laide, vous pouvez simplement sortir à du.

See here.

+1

'du' serait mon choix ici, car il fournit les données que l'OP recherche et il est facile de l'appeler pour un fichier individuel ou pour un répertoire entier de contenu. – Ether