Y a-t-il une situation possible lorsque
ls -l file.txt
affiche pas le même nombre d'octets que
wc -c file.txt
Dans un script, j'ai trouvé une comparaison de ces deux valeurs. Quelle pourrait être la raison de cela? Est-il même possible d'avoir différents nombres d'octets du même fichier?
Réponses:
Oui, il y a de tels cas.
En cas de liens symboliques sur un système Linux avec GNU
ls
, lels -l
affichera la taille du lien, tandis quewc -c
résoudra le fichier réel et y lira le nombre d'octets. Ci-dessous, vous pouvez voir quels -l
rapporte 29 octets, alors quewc
172 rapporte dans le fichier réel.Dans le cas de systèmes de fichiers virtuels , tels que
/proc
ou/sys
, de nombreux fichiers s'affichent comme ayant une taille 0ls -l
. Sous le/dev
système de fichiers, nous avons une variété de fichiers spéciaux, tels que les périphériques de caractères et les périphériques de bloc - sewc -c
bloque sur ceux-ci etls -l
affiche des nombres majeurs et mineurs au lieu de la taille.Les canaux nommés seront signalés en
0
octets parls -c
, maiswc -c
liront en fait le contenu du canal, donc techniquement, il vous indiquera la quantité de données dans le canal nommé:Pour un fichier normal, la taille doit être égale.
Le point de
ls -l
etwc -c
, et leur fonctionnement diffèrent également.wc -c
ouvre réellement le fichier pour la lecture (vous pouvez le voir si vous exécutezstrace wc -c /etc/passwd
par exemple).ls -l
effectue uniquement l'stat()
appel sur ceux-ci. Cela explique également pourquoi, dans la/proc
ls -l
taille 0, vous ne pouvez pas statiser ces fichiers car ils ne sont pas "réels" ou réellement stockés sur le disque dur / ssd.wc -c
à la place, lit le contenu de ce fichier et calcule sa taille.Finalement,
ls -l
n'est qu'un outil pour répertorier les éléments de manière interactive. C'est rarement un bon choix pour les scripts. Lorsque vous avez réellement besoin de lire les données, utilisezwc -c
plutôt.Veuillez noter que pour l'écriture de scripts et l'évaluation de la taille d'un fichier, ce
ls
n'est pas le meilleur candidat. En fait, c'est l'une des pratiques courantes pour éviter l'analyse de lals
sortie . Veuillez utiliserdu -b
pour connaître la taille d'un fichier.la source
/sys/
,/proc/
etc.) peut fournir desstat
informations, si les Implementer choisit de. La plupart du temps, il n'y a pas de raison impérieuse, donc c'est omis. Les exemples incluent/proc/kcore
ce qui est rapporté comme la taille de la mémoire du noyau adressable (généralement beaucoup plus que la mémoire physique disponible).ls -l
renverra la taille du fichier signalé par le système de fichiers.wc -c
tentera de lire le fichier pour déterminer la taille «réelle». D'après mes observations, il semble d'abord essayer de chercher jusqu'à la fin, et si cela ne fonctionne pas, il lira le fichier entier, en comptant la taille au fur et à mesure.Il s'agit d'une simple description de ce que font les deux outils, mais elle entraîne un certain nombre d'implications pour les résultats:
ls
donnera une sortie incorrecte pour certains systèmes de fichiers. Par exemple, les systèmes de fichiers virtualisés comme/proc
rapporteront une taille nulle pour de nombreux fichiers, car ces "fichiers" ne sont physiquement stockés nulle part; ils sont générés selon les besoins du logiciel.wc
ne fonctionnera pas du tout pour les fichiers sans autorisations de lecture, alors qu'ills
ne nécessite que des autorisations pour répertorier le répertoire (comparerls -l /etc/shadow
àwc -c /etc/shadow
).Comme mentionné dans d'autres réponses, le comportement des liens symboliques est également différent. Parce qu'il
wc
essaie de les lire, il finit par lire le fichier vers lequel pointe le lien symbolique, tandis que parcels
qu'il interroge simplement le système de fichiers, il indiquera la taille utilisée pour stocker le lien symbolique lui-même.Je suis sûr qu'il y a d'autres différences auxquelles je n'ai pas encore pensé, mais je pensais donner une explication claire et simple quant à la raison fondamentale derrière ces différences.
la source
seek()
. Cela semble être le cas, après avoir exécutéstrace wc -l
quelques gros fichiers.Pour un fichier normal, ls et wc appellent stat. Cependant, pour un fichier de / proc ou / sys, ls renvoie 0, mais wc renvoie un nombre différent:
C'est probablement un moyen de savoir si quelque chose est un fichier spécial.
la source
wc -c
pour moi au moins appellefstat
, mais apparemment à d'autres fins. Il trouve la longueur du fichierlseek
jusqu'à la fin. Dans le cas où cela renvoie une erreur, il s'agit deread
l'intégralité du fichier.