Tak, są takie przypadki.
W przypadku dowiązań symbolicznych w systemie Linux z GNU ls
, ls -l
wypisze rozmiar łącza, a jednocześnie wc -c
rozwiąże rzeczywisty plik i odczyta tam liczbę bajtów. Poniżej widać, że ls -l
raportuje 29 bajtów, podczas gdy wc
raportuje 172 bajty w rzeczywistym pliku.
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 1月 17 2016 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ wc -c /etc/resolv.conf
172 /etc/resolv.conf
$ wc -c /var/run/resolvconf/resolv.conf
172 /var/run/resolvconf/resolv.conf
$ ls -l /var/run/resolvconf/resolv.conf
-rw-r--r-- 1 root root 172 1月 15 15:49 /var/run/resolvconf/resolv.conf
W przypadku wirtualnych systemów plików , takich jak/proc
lub /sys
, wiele plików będzie miało rozmiar 0 ls -l
. W /dev
systemie plików mamy wiele specjalnych plików, takich jak urządzenia znakowe i urządzenia blokowe - wc -c
zawiesza się na nich i ls -l
pokazuje większe i mniejsze liczby zamiast wielkości.
Nazwane potoki będą zgłaszane jako 0
bajty przez ls -c
, ale w wc -c
rzeczywistości odczytują zawartość potoku, więc technicznie powie ci, ile danych jest w nazwanym potoku:
$ mkfifo named.pipe
$ echo "This is a test" > named.pipe &
[1] 2129
$ ls -l named.pipe
prw-rw-r-- 1 xieerqi xieerqi 0 1月 16 08:40 named.pipe|
$ wc -c named.pipe
15 named.pipe
[1] + Done echo "This is a test" >named.pipe
W przypadku zwykłych plików rozmiar powinien być równy.
Punkt ls -l
a wc -c
, i jak one działają także różni. wc -c
faktycznie otwiera plik do odczytu (możesz to zobaczyć, jeśli uruchomisz strace wc -c /etc/passwd
na przykład). ls -l
wykonuje tylko stat()
połączenia na tych. Wyjaśnia to również, dlaczego w /proc
ls -l
programach pokazuje rozmiar 0 - nie można statystyki tych plików, ponieważ nie są one „prawdziwe” lub faktycznie przechowywane na dysku twardym / ssd. wc -c
zamiast tego odczytuje zawartość tego pliku i oblicza jego rozmiar.
Wreszcie ls -l
jest tylko narzędziem do interaktywnego wyświetlania pozycji. Rzadko nadaje się do pisania skryptów. Gdy rzeczywiście potrzebujesz odczytać dane, użyj wc -c
zamiast tego.
Należy pamiętać, że do pisania skryptów i oceny rozmiaru pliku ls
nie jest najlepszym kandydatem. W rzeczywistości jest to jedna z powszechnych praktyk unikania analizowania ls
wyników . Użyj, du -b
aby sprawdzić rozmiar pliku.