如何快速统计一个文件的大小?一个URL对应的文件的大小?GZip压缩之后的大小?
这对于部署一个网站的时候,如何选择合适的库、合适的部署方式很有帮助。
我们可以在 Node.js 的帮助下,无需额外的步骤,一行命令就能实现对各种数据大小的花式统计。
原始大小
# 文件
$ cat FILE | wc -c
$ wc -c <FILE
# URL
$ curl -sL URL | wc -c
-
cat FILE
将文件输出到 stdout 用于 pipe 到后面的工具。
-
wc -c
统计字节数,与编码无关。
-
curl -sL URL
下载文件并输出到 stdout,
-s
表示不输出额外的提示信息,-L
表示自动跟随跳转。
注:这里不直接调用 wc -c FILE
而使用 pipe 的方式,是因为 wc -c FILE
会对参数中的每个文件大小分别统计,并且将输入的文件名也输出到 stdout,不利于后续的处理。
友好展示
通过上面的方法我们会得到一个数字,就是文件或字节流的大小。然而当数字很大时,我们可能会没有体感,这时更适合转换成带单位的形式,如 10MB
,而不是 10000000
。
可以借助 Sindre Sorhus 大神封装的库,将字节数以更易读的方式展示出来:
$ get_your_stream | wc -c | npx pretty-bytes-cli
如果希望 npx
的日志信息完全不要透出,可以使用 npx -q
,这可能导致命令异常时排查困难,可以酌情使用。
GZip 压缩大小
# 文件
$ npx gzip-size-cli FILE
# 或
$ cat FILE | npx gzip-size-cli
# URL
$ curl -sL URL | npx gzip-size-cli
-
npx gzip-size-cli
Sindre Sorhus 大神封装的另一个库,统计 GZip 压缩后的大小,并默认使用易读的带单位的形式输出。
如果想输出原始的数字,可以使用
npx gzip-size-cli --raw
。
一步到位
如何实现一行命令同时统计出原始大小和 GZip 大小呢?这里存在的问题是,流只能被消费一次,用完了就没有了。所以我们可以借助 tee 这个命令,来对流进行复制和转发。
$ get_your_stream | tee >(wc -c | npx -q pretty-bytes-cli) | npx -q gzip-size-cli
注:tee 会将流复制并转发到一个子 Shell 来运行对应的命令,不同子 Shell 中的命令是在不同进程中并发运行的,所以输出的顺序是不确定的。