Comment obtenir la taille physique d'un fichier sous Linux?

12

Je peux utiliser ls -lpour obtenir la taille logique d'un fichier, mais existe-t-il un moyen d'obtenir la taille physique d'un fichier?

user285003
la source
Veuillez définir ce que vous entendez par taille "physique".
Jörg W Mittag

Réponses:

28

ls -lvous donnera la taille apparente du fichier, qui est le nombre d'octets qu'un programme lirait s'il lisait le fichier du début à la fin. duvous donnerait la taille du fichier "sur disque".

Par défaut, duvous donne la taille du fichier en nombre de blocs de disque, mais vous pouvez utiliser -hpour obtenir une unité lisible par l'homme à la place. Voir également le manuel de duvotre système.

Notez qu'avec GNU coreutil du(qui est probablement ce que vous avez sous Linux), -bobtenir des octets implique l' --apparent-sizeoption. Ce n'est pas ce que vous souhaitez utiliser pour obtenir le nombre d'octets réellement utilisés sur le disque. Utilisez plutôt --block-size=1ou -B 1.

Avec GNU ls, vous pouvez également le faire ls -s --block-size=1sur le fichier. Cela donnera le même numéro que du -B 1pour le fichier.


Exemple:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

Cela signifie qu'il s'agit d'un fichier de 512 Mo qui prend environ 24 Ko sur le disque. Il s'agit d'un fichier clairsemé (principalement des zéros qui ne sont pas réellement écrits sur le disque mais représentés comme des "trous" logiques dans le fichier). Les fichiers épars sont courants lorsque vous travaillez avec des fichiers volumineux pré-alloués, par exemple des images de disque pour des machines virtuelles ou des fichiers d'échange, etc. La création d'un fichier épars est rapide, tandis que le remplir avec des zéros est lent (et inutile).

Voir également le manuel de fallocatevotre système Linux.

Kusalananda
la source
dans quel cas cette différence est importante? pouvez-vous faire un exemple pratique? Merci d'avance.
D'Arcy Nader
1
@ D'ArcyNader Voir la réponse mise à jour.
Kusalananda
Corrigez-moi si je comprends mal quelque chose, mais il semble que la première phrase soit l'inverse: stackoverflow.com/a/31437673/3701431 du montrerait combien de données peuvent être réellement lues, tout en lsmontrant dans quelle mesure les secteurs de disque sont alloués.
Sergiy Kolodyazhnyy
2
@SergiyKolodyazhnyy (désolé de répondre tardivement) Non, dumontre la quantité de disque réellement utilisée par le fichier, tandis que la taille apparente (taille logique) indiquée par lsest le nombre d'octets qu'un programme pourrait lire. Si le fichier est clairsemé, certains des octets de lecture seraient des zéros, mais ils seraient toujours remis au programme qui les a lus (mais pas à partir du disque).
Kusalananda
Ce fut une très bonne réponse.
Lizardx
3

J'obtiens la taille du fichier en octets comme ceci:

actualsize=$(du -b "${file}" | cut -f 1)
woohoo
la source