一行命令统计字节流大小

如何快速统计一个文件的大小?一个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 中的命令是在不同进程中并发运行的,所以输出的顺序是不确定的。


© 2020