Il n'y a pas d'inexactitude ou de problème de fiabilité ici, vous comparez simplement deux nombres différents :la taille logique et la taille physique.
Voici l'illustration de Wikipedia pour les fichiers fragmentés :
ls
montre les zones grises+vertes, la longueur logique du fichier. du
(sans --apparent-size
) ne montre que les zones vertes, puisque ce sont celles qui occupent de l'espace.
Vous pouvez créer un fichier fragmenté avec dd count=0 bs=1M seek=100 of=myfile
.
ls
affiche 100 Mo, car c'est la longueur du fichier :
$ ls -lh myfile
-rw-r----- 1 me me 100M Jul 15 10:57 myfile
du
affiche 0, car c'est la quantité de données qui lui est allouée :
$ du myfile
0 myfile
ls -l --block-size=M
vous donnera une liste de format long (nécessaire pour voir réellement la taille du fichier) et des tailles de fichier arrondies au MiB
le plus proche .
Si vous voulez MB
(10^6 octets) plutôt que MiB
(2^20 octets) unités, utilisez --block-size=MB
à la place.
Si vous ne voulez pas le M
suffixe attaché à la taille du fichier, vous pouvez utiliser quelque chose comme --block-size=1M
. Merci Stéphane Chazelas pour cette suggestion.
Ceci est décrit dans la page de manuel pour ls
; man ls
et recherchez SIZE
. Il permet des unités autres que MB/MiB
ainsi, et à première vue (je n'ai pas essayé cela), des tailles de bloc arbitraires également (vous pouvez donc voir la taille du fichier en nombre de blocs de 412 octets, si vous le souhaitez).
Notez que le --block-size
le paramètre est une extension GNU au-dessus du ls
du groupe ouvert , cela peut donc ne pas fonctionner si vous n'avez pas d'espace utilisateur GNU (ce que font la plupart des installations Linux). Le ls de GNU coreutils 8.5 prend en charge --block-size
comme décrit ci-dessus.
Il existe plusieurs notions de taille de fichier, comme expliqué dans la réponse de cet autre guiy et le chiffre de la page wiki sur les fichiers épars.
Cependant, vous pouvez utiliser à la fois les commandes ls(1) et stat(1).
Si vous codez en C, envisagez d'utiliser les appels système stat(2) et lseek(2).
Voir aussi les références dans cette réponse.