Счетчик байтов «ls -l » по сравнению с «wc -c »

I увидеть, что ваш Auto Mute включен. Однажды была эта проблема, и я переключил ее на Disabled. После этого работал. Хотя теперь у меня возникла новая проблема после попытки установить Pipelight в качестве альтернативы Silverlight. Так что, если у кого-то есть какие-либо решения помимо этого, это было бы здорово.

25
16.01.2017, 17:13
3 ответа

ls -l вернет размер файла, о котором сообщает файловая система.

wc -c попытается прочитать файл, чтобы определить «фактический» размер. По моим наблюдениям, сначала кажется, что он пытается искать до конца, и если это не сработает, он считывает весь файл, считая его размер.

Это простое описание того, что делают эти два инструмента, но оно приводит к ряду последствий для результатов:

ls выдаст неверный результат для определенных файловых систем. Например, виртуализированные файловые системы, такие как / proc , будут сообщать нулевой размер для многих файлов, потому что эти «файлы» физически нигде не хранятся; они генерируются в соответствии с требованиями программного обеспечения.

wc не будет работать вообще для файлов без разрешений на чтение, тогда как ls требует только разрешений для перечисления каталога (сравните ls -l / etc / shadow с wc -c / etc / shadow ).

Как упоминалось в других ответах, поведение символических ссылок также отличается. Поскольку wc пытается их прочитать, он заканчивает чтение файла, на который указывает символическая ссылка, тогда как поскольку ls просто запрашивает файловую систему, он сообщит размер, используемый для хранения символической ссылки. сам.

Я уверен, что есть и другие отличия, о которых я еще не думал, но я подумал, что дам ясное и простое объяснение основной причины этих различий.

12
27.01.2020, 19:40

Да, такие случаи бывают.

В случае символических ссылок в системе 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 отображается нулевой размер - вы не можете определить эти файлы, потому что они не являются "настоящими" или фактически хранятся на жестком диске / ssd. wc -c вместо этого считывает содержимое этого файла и вычисляет его размер.

Наконец, ls -l - это всего лишь инструмент для интерактивного вывода списка элементов. Он редко подходит для написания сценариев. Если вам действительно нужно прочитать данные, используйте вместо них wc -c .

Обратите внимание, что для написания сценариев и оценки размера файла ls не лучший кандидат. Фактически, это одна из общепринятых практик, избегая синтаксического анализа ls вывода . Используйте du -b , чтобы узнать размер файла.

13
27.01.2020, 19:40

Для обычного файла ls и wc вызывают stat. Однако для файла / proc или / sys ls возвращает 0, а wc возвращает другое число:

$ ls -l /proc/modules
-r--r--r--  1 root root 0 Jan 16 14:56 modules
                        ^ this one
$ wc -c /proc/modules
7621 modules

Это, вероятно, способ узнать, является ли что-то специальным файлом.

6
27.01.2020, 19:40

Теги

Похожие вопросы