Gibt es eine mögliche Situation, wenn
ls -l file.txt
zeigt nicht die gleiche Anzahl von Bytes an wie
wc -c file.txt
In einem Skript habe ich einen Vergleich dieser beiden Werte gefunden. Was könnte der Grund dafür sein? Ist es überhaupt möglich, dass dieselbe Datei unterschiedliche Bytezahlen hat?
Antworten:
Ja, es gibt solche Fälle.
Im Fall von Symlinks auf Linux - System mit GNU
ls
, diels -l
die Größe der Verbindung löschen, währendwc -c
die tatsächliche Datei und liest Anzahl von Bytes , die dort zu lösen. Unten sehen Sie, dassls -l
29 Bytes gemeldet werden, währendwc
die aktuelle Datei 172 Bytes enthält.Im Fall eines virtuellen Dateisysteme , wie
/proc
oder/sys
, werden viele Dateien dort zeigen , wie Größe 0 mitls -l
. Unter/dev
Dateisystem haben wir eine Vielzahl von speziellen Dateien, wie Zeichengeräte und Blockgeräte -wc -c
hängt an diesen undls -l
zeigt statt der Größe Haupt- und Nebenzahlen an.Named Pipes werden als
0
Bytes von gemeldetls -c
,wc -c
lesen jedoch tatsächlich den Inhalt der Pipe. Technisch wird Ihnen also mitgeteilt , wie viele Daten sich in der Named Pipes befinden :Bei normalen Dateien sollte die Größe gleich sein.
Der Sinn von
ls -l
undwc -c
und wie sie funktionieren ist ebenfalls unterschiedlich.wc -c
Tatsächlich öffnet sich die Datei zum Lesen (Sie können das sehen, wenn Siestrace wc -c /etc/passwd
zum Beispiel ausführen ).ls -l
führt nur einenstat()
Anruf auf diesen durch. Dies erklärt auch, warum in/proc
ls -l
Shows der Größe 0 diese Dateien nicht angegeben werden können, da sie nicht "echt" oder tatsächlich auf der Festplatte / ssd gespeichert sind.wc -c
Liest stattdessen den Inhalt dieser Datei und berechnet ihre Größe.Schließlich
ls -l
ist nur ein Tool zum interaktiven Auflisten von Elementen. Es ist selten gut für Skripte geeignet. Wenn Sie die Daten tatsächlich lesen müssen, verwenden Siewc -c
stattdessen.Bitte beachten Sie, dass für die Skripterstellung und die Größenbestimmung einer Datei
ls
nicht der beste Kandidat ist. Tatsächlich ist es eine der gebräuchlichsten Methoden, das Parsen vonls
Ausgaben zu vermeiden . Bitte verwenden Siedu -b
, um die Größe einer Datei zu ermitteln.quelle
/sys/
,/proc/
usw.) könnenstat
Informationen liefern , wenn der Implementierer dies wünscht. Die meiste Zeit gibt es keinen zwingenden Grund dafür, so dass es weggelassen wird. Zu den Beispielen gehört,/proc/kcore
welche als Größe des adressierbaren Kernelspeichers angegeben wird (normalerweise viel mehr als der verfügbare physische Speicher).ls -l
Gibt die Größe der vom Dateisystem gemeldeten Datei zurück.wc -c
versucht, die Datei zu lesen, um die tatsächliche Größe zu ermitteln. Nach meinen Beobachtungen scheint es, als würde man zuerst versuchen, bis zum Ende zu suchen. Wenn dies nicht funktioniert, wird die gesamte Datei ausgelesen, wobei die Größe mitgezählt wird.Dies ist eine einfache Beschreibung der Funktionsweise der beiden Tools, die jedoch eine Reihe von Auswirkungen auf die Ergebnisse hat:
ls
gibt für bestimmte Dateisysteme eine falsche Ausgabe aus. Beispielsweise geben virtualisierte Dateisysteme wie beispielsweise/proc
für viele Dateien eine Größe von Null an, da diese "Dateien" nirgendwo physisch gespeichert sind. Sie werden nach Bedarf von der Software generiert.wc
funktioniert überhaupt nicht für Dateien ohne Leseberechtigungen, währendls
nur Berechtigungen zum Auflisten des Verzeichnisses erforderlich sind (vergleichenls -l /etc/shadow
mitwc -c /etc/shadow
).Wie in anderen Antworten erwähnt, unterscheidet sich auch das Verhalten für symbolische Verknüpfungen. Da
wc
versucht wird, sie zu lesen, wird die Datei gelesen, auf die der Symlink verweist. Da jedochls
nur das Dateisystem abgefragt wird, wird die Größe angegeben, die zum Speichern des symbolischen Links verwendet wird.Ich bin mir sicher, dass es andere Unterschiede gibt, an die ich noch nicht gedacht habe, aber ich dachte, ich würde eine klare und einfache Erklärung für den Grund hinter diesen Unterschieden geben.
quelle
seek()
. Dies scheint der Fall zu sein, nachdemstrace wc -l
einige große Dateien ausgeführt wurden.Für eine normale Datei rufen ls und wc stat auf. Für eine Datei von / proc oder / sys gibt ls 0 zurück, wc jedoch eine andere Zahl:
Dies ist wahrscheinlich eine Möglichkeit herauszufinden, ob es sich bei etwas um eine spezielle Datei handelt.
quelle
wc -c
für mich heißt das zumindestfstat
, aber scheinbar für andere zwecke. Es findet die Länge der Dateilseek
bis zum Ende. Für den Fall, dass dies einen Fehler zurückgibt, handelt es sich umread
die gesamte Datei.