“ ls -l <​​随机文件>”的字节数与“ wc -c <随机文件>”的字节数


Answers:


13

是的,有这种情况。

在使用GNU的Linux系统上进行符号链接的情况下lsls -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 -lstat()对那些执行呼叫。这也解释了为什么in /proc ls -l显示0大小-您不能统计这些文件,因为它们不是“真实的”或实际存储在硬盘驱动器/ ssd中。wc -c而是读取该文件的内容,然后计算其大小。

最后,ls -l它只是用于交互式列出项目的工具。它很少适合脚本编写。当您实际需要读取数据时,请wc -c改用。

请注意,对于脚本编制和评估文件大小,ls它不是最佳选择。实际上,避免解析ls输出是一种常见的做法。请du -b 用于查找文件大小。


1
简要说明- 如果实施者选择,虚拟文件(位于/sys//proc/等)可以提供stat信息。大多数时候,没有令人信服的理由,因此将其省略。示例包括/proc/kcore报告为可寻址内核内存的大小(通常比可用物理内存大得多)。
Toby Speight

11

ls -l 将返回文件系统报告的文件大小。

wc -c将尝试读取文件以确定“实际”大小。根据我的观察,它似乎首先尝试搜索到末尾,如果这不起作用,它将读出整个文件,并随着大小进行计数。

这是对这两种工具的作用的简单描述,但是它对结果产生了许多影响:

ls对于某些文件系统将给出错误的输出。例如,像这样的虚拟文件系统/proc会报告许多文件的大小为零,因为这些“文件”并未实际存储在任何地方。它们是按软件要求生成的。

wc将所有没有读取权限的文件无法正常工作,而ls只需要权限列出目录(对比ls -l /etc/shadowwc -c /etc/shadow)。

如其他答案中所述,符号链接的行为也不同。由于wc尝试读取它们,最终将读取符号链接指向的文件,而由于ls仅查询文件系统,它将报告用于存储符号链接本身的大小。

我确定我还没有想到其他差异,但是我想就这些差异背后的基本原因给出一个清晰而简单的解释。


+1表示阅读权限和seek()。在运行strace wc -l几个大文件后,情况似乎是这样。
Sergiy Kolodyazhnyy

+1可增加比我的答案更多的细节!
Cyclic3

6

对于普通文件,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

这可能是找出某些东西是否是特殊文件的某种方式。


2
wc -c对我来说至少会打电话给我fstat,但似乎是出于其他目的。它通过查找lseek末尾找到文件的长度。如果返回错误,read则为整个文件。
Muzer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.