42 votes

Pourquoi ls -l affiche-t-il une taille différente de ls -s?

Je ne comprends pas pourquoi j'obtiens les résultats suivants :

ls -l me dit que la taille d'un fichier donné (HISTORY) est "581944" :

$ ls -l HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY

ls -s dit que c'est "572" :

$ ls -s HISTORY
572 HISTORY

Je dois évidemment amener les valeurs à une échelle comparable. Donc d'abord je confirme qu'en utilisant --block-size 1 dans ls -l j'obtiens le même résultat qu'avant :

$ ls -l --block-size 1 HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY

Ensuite, je fais de même pour ls -s pour obtenir une valeur sur la même échelle :

$ ls -s --block-size 1 HISTORY 
585728 HISTORY

Résultats différents ! 581944 != 585728.

J'ai essayé de générer des valeurs comparables dans l'autre sens, en utilisant -k, mais j'obtiens :

$ ls -lk HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 569 Feb 22 10:59 HISTORY
$ ls -sk HISTORY 
572 HISTORY

Encore une fois, des résultats différents, 569 != 572.

J'ai essayé de spécifier --si pour m'assurer que les deux options utilisaient la même échelle, en vain :

$ ls -lk --si HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 582k Feb 22 10:59 HISTORY
$ ls -sk --si HISTORY 
586k HISTORY

...encore une fois, des valeurs différentes : 582k != 586k.

J'ai cherché sur le web mais la seule chose que j'ai trouvée qui semblait pertinente était ceci :

Certains fichiers ont des "trous", de sorte que l'utilisation indiquée par ls -s (...) est inférieure à la taille du fichier indiquée par ls -l."

(remarquez que dans mes résultats le contraire se produit : ls -s renvoie des tailles plus grandes que ls -l, pas plus petites.)

Pendant ce temps, cette page dit que

il n'y a pas de moyen élégant de détecter les trous de fichiers Unix.

Alors, comment puis-je gérer cette discrepancy ? Quelle de ces valeurs peut être considérée comme correcte ? Est-ce possiblement un bug dans ls ?

53voto

phoibos Points 19941

Réponse courte:

  • ls -l donne la taille du fichier (= la quantité de données qu'il contient)
  • ls -s --block-size 1 donne la taille du fichier sur le système de fichiers

Créons deux fichiers:

Un fichier creux de longueur 128 octets (Un fichier creux est un fichier contenant des blocs vides, voir Fichier Creux):

# truncate -s 128 f_zeroes.img
# hexdump -vC f_zeroes.img 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000070  00 00

15voto

guntbert Points 12407

ls -s vous indique la taille allouée du fichier, toujours un multiple de l'unité d'allocation. ls -l indique la taille réelle. Un moyen facile de tester:

$ echo 1 > sizeTest
$ ls -l --block-size 1 sizeTest 
-rw-rw-r-- 1 g g 2 Mär 18 15:18 sizeTest
$ ls -s --block-size 1 sizeTest 
4096 sizeTest

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X