Да, есть такие случаи.
В случае символьных ссылок в системе Linux с GNU ls
, он ls -l
выдаст размер ссылки, а wc -c
также разрешит фактический файл и прочитает количество байтов там. Ниже вы можете видеть, что ls -l
сообщает 29 байтов, а wc
сообщает 172 байта в реальном файле.
$ 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
В случае виртуальных файловых систем , таких как/proc
или /sys
, многие файлы там будут иметь размер 0 ls -l
. Под /dev
файловой системой у нас есть множество специальных файлов, таких как символьные устройства и блочные устройства - они wc -c
подвешены на них и ls -l
показывают большие и младшие числа вместо размера.
Именованные каналы будут сообщаться как 0
байты ls -c
, но на wc -c
самом деле будут читать содержимое канала, поэтому технически он скажет вам, сколько данных находится в именованном канале:
$ 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
Для обычных файлов размер должен быть одинаковым.
Суть ls -l
и wc -c
, и как они работают, также отличается. wc -c
фактически открывает файл для чтения (вы можете увидеть это, если вы запустите, strace wc -c /etc/passwd
например). ls -l
только выполняет stat()
вызов на тех. Это также объясняет, почему в /proc
ls -l
шоу отображается размер 0 - вы не можете определить эти файлы, потому что они не являются «настоящими» или фактически хранятся на жестком диске / ssd. wc -c
вместо этого читает содержимое этого файла и вычисляет его размер.
Наконец, ls -l
это всего лишь инструмент для интерактивного перечисления предметов. Это редко подходит для сценариев. Когда вам действительно нужно прочитать данные, используйте wc -c
вместо этого.
Обратите внимание, что для написания сценариев и оценки размера файла, ls
это не лучший кандидат. Фактически, это одна из распространенных практик, позволяющая избегать анализа ls
вывода . Пожалуйста, используйте du -b
для выяснения размера файла.