Quelle est la difference entre du -h et ls -lh?

31

J'ai du mal à comprendre quelle est la bonne façon de lire la taille des fichiers car chaque commande vous donne des résultats variables. Je suis également tombé sur un article à http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html qui indique ce qui suit;

du vous donne la taille du fichier tel qu'il réside sur le système de fichiers. (IE vous donnera toujours un résultat divisible par 1024).

ls vous donnera la taille réelle du fichier.

Ce que vous regardez, c'est la différence entre la taille réelle du fichier et la quantité d'espace sur le disque qu'il faut. (également appelé efficacité du système de fichiers).

Quelle est la différence entre le fait qu'il réside sur le système de fichiers et la taille réelle du fichier

PeanutsMonkey
la source

Réponses:

48

C'est ce qu'on appelle l' espace lâche :

Chaque couche d'abstraction au-dessus de bits et d'octets individuels entraîne un gaspillage d'espace lorsqu'un fichier de données est plus petit que la plus petite unité de données que le système de fichiers est capable de suivre. Cet espace gaspillé dans un secteur, un cluster ou un bloc est communément appelé espace libre et il ne peut normalement pas être utilisé pour le stockage de données supplémentaires. Pour les secteurs individuels de 256 octets, l'espace gaspillé maximum est de 255 octets. Pour les grappes de 64 kilo-octets, l'espace gaspillé maximum est de 65 535 octets.

Donc, si votre système de fichiers alloue de l'espace en unités de 64 Ko et que vous stockez un fichier de 3 Ko, alors:

  • la taille réelle du fichier est de 3 Ko.
  • la taille résidente du fichier est de 64 Ko, car les 61 Ko restants de cette unité ne peuvent pas être alloués à un autre fichier et sont donc perdus.

Remarque : Certains systèmes de fichiers prennent en charge la sous -allocation de blocs , ce qui permet d'atténuer ce problème en affectant plusieurs petits fichiers (ou les extrémités de fichiers volumineux) dans le même bloc.

Homme à tout faire5
la source
1
C'est une putain de bonne explication.
SpacemanSpiff
1
@ Handyman5 - Merci Handyman5. Ainsi, lorsque je regarde la taille d'un fichier ou d'un dossier à l'aide de ls, il renvoie la taille réelle tandis que du renvoie la taille résidente. Est-ce exact? Donc, quand on regarde la taille du fichier, quelle est la plus précise, c'est-à-dire la taille du résident ou la taille du fichier ou est-ce une question arbitraire?
PeanutsMonkey
8
@PeanutsMonkey, la précision est dans l'œil du spectateur. ;-) Fondamentalement, si vous êtes préoccupé par la quantité d'espace que le fichier prendrait ailleurs (comme la copie sur le réseau, l'ajout à un fichier zip, la sauvegarde sur un disque externe, etc.), la taille réelle est ce que vous vous souciez. Si vous êtes préoccupé par la quantité d'espace restant sur le lecteur où se trouve le fichier, vous vous souciez de la taille du résident. Puisque duvous montre la sauge disk u, il regarde l'espace occupé sur le lecteur actuel, et donc il vous montre la taille du résident.
Handyman5
1
@ Handyman5 - C'est presque un an après la publication, mais je suis curieux de savoir comment la réponse ci-dessus diffère lors de l'utilisation df -h?
PeanutsMonkey
1
dfsignale le nombre de blocs restants * la taille du bloc du système de fichiers. Dans ce cas, ce serait plus du, car même les blocs partiellement utilisés sont considérés comme entièrement alloués. dftraduit essentiellement statvfs , vous pouvez donc consulter cet appel système pour avoir une meilleure idée de ce qui se passe.
Handyman5
19

Il y a une autre option ici, qui n'a pas été couverte - les fichiers épars . Dans ce cas, duaffiche une taille plus petite qu'un simple ls -lserait, parce que lsrapporte la « taille » du fichier comme étant la apparente taille (le nombre d'octets que vous pouvez lire, si vous vouliez beaucoup de zéros), alors que la duvolonté continuer à utiliser le nombre réel de blocs de disques en cours d'utilisation.

Astuce amusante: créez un grand nombre de gros fichiers clairsemés, puis impressionnez vos amis avec l'espace disque dont vous disposez ("regardez, je stocke des fichiers de 1 To pour soixante-dix milliards de gaz sur mon disque dur!"). OK, peut-être pas si amusant alors.

femme
la source
6

Les systèmes de fichiers sont constitués de blocs. Les fichiers n'ont pas besoin de s'intégrer parfaitement dans les blocs. Si un fichier était de 1024 octets, sa taille en ls et du serait de 1024. Si la taille du fichier était de 1025, la taille serait de 1025 en ls et de 2048 en du.

Notez que l'exemple ci-dessus suppose une taille de bloc de 1024. De plus grandes tailles de bloc sont la norme de nos jours e, g,

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred
Iain
la source
0

Il y a encore une autre raison pour laquelle ils peuvent être différents. du -h sait quand il voit le même fichier sous un autre nom (liens durs, par opposition aux liens symboliques) et signalera chaque fichier pour la taille qu'il est, mais n'ajoute la taille qu'une seule fois au répertoire parent commun.

Clifford Heath
la source