数字を人の読みやすいように加工する『numfmt』コマンド

シェルスクリプトやCUIでLinuxを操作していると、バイトで記述された容量を人が読みやすい状態に加工したい時がある。
それを簡単に行えるのが、Coreutils 8.22から追加された『numfmt』コマンドだ。

少なくとも、CentOS 7やUbuntu 14.04 LTSでは標準で利用することが出来る。

このコマンドの使い方については、もう見てもらった方が早いだろう。
以下のようにechoで「4096000(4MB相当)」を出力し、それをnumfmtに渡す。すると…

echo 4096000 | numfmt --to=iec

[root@test-apache ~]# echo 4096000
4096000
[root@test-apache ~]# echo 4096000 | numfmt --to=iec
4.0M

このように、人が見てわかりやすい容量に加工してくれるのだ。
区切り文字や何列目の数字を加工するかについても指定できて、地味にかなり便利なコマンド。

もちろん、計算方法も1000で単位を上げるのか、1024で単位を上げるのか「--to=UNIT」で指定可能だ。
以下、指定できるUNITについて、helpの内容を一部抜粋する。

UNIT options:
  none       no auto-scaling is done; suffixes will trigger an error
  auto       accept optional single/two letter suffix:
               1K = 1000,
               1Ki = 1024,
               1M = 1000000,
               1Mi = 1048576,
  si         accept optional single letter suffix:
               1K = 1000,
               1M = 1000000,
               ...
  iec        accept optional single letter suffix:
               1K = 1024,
               1M = 1048576,
               ...
  iec-i      accept optional two-letter suffix:
               1Ki = 1024,
               1Mi = 1048576,
               ...

基本的には、バイト数を計算させるならば「iec」「iec-i」を使えばいいだろう。

その他、こんな事もできる。
例えば、以前こちらで紹介したLinuxの特定ディレクトリ配下で容量を食ってるファイルTOP10を抽出するコマンドと組み合わせると…

ls -la $(find /調べたいディレクトリ -type f) | sort -nr -k5 | head -10 #既存のコマンド
ls -la $(find /調べたいディレクトリ -type f) | sort -nr -k5 | head -10 | numfmt --to=iec --field=5 # numfmtで加工する

[root@test-centos7 ~]# ls -la $(find /work -type f) | sort -nr -k5 | head -10
-rw-r--r--. 1 root   root   1024000000  7月 26 11:29 /work/test2.bk
-rw-r--r--. 1 root   root   1024000000  7月 26 11:29 /work/test1.bk
-rw-r--r--. 1 root   root   1024000000  7月 11 05:13 /work/test2
-rw-r--r--. 1 root   root   1024000000  7月 11 05:12 /work/test1
-rw-r--r--. 1 root   root    209715200  7月 26 11:28 /work/sample.bk
-rw-r--r--. 1 root   root    209715200  6月  8 23:12 /work/sample
-rw-r--r--. 1 root   root     36814848  7月 26 11:28 /work/test.image.bk
-rw-r--r--. 1 root   root     36814848  6月 20 19:37 /work/test.image
-rw-r--r--. 1 root   root        99973 11月 16 11:44 /work/20151113_134734_AWSテスト.log
-rw-r--r--. 1 root   root        64368 10月 27 06:44 /work/test7_2.sh
[root@test-centos7 ~]#
[root@test-centos7 ~]# ls -la $(find /work -type f) | sort -nr -k5 | head -10 | numfmt --to=iec --field=5
-rw-r--r--. 1 root   root         977M  7月 26 11:29 /work/test2.bk
-rw-r--r--. 1 root   root         977M  7月 26 11:29 /work/test1.bk
-rw-r--r--. 1 root   root         977M  7月 11 05:13 /work/test2
-rw-r--r--. 1 root   root         977M  7月 11 05:12 /work/test1
-rw-r--r--. 1 root   root         200M  7月 26 11:28 /work/sample.bk
-rw-r--r--. 1 root   root         200M  6月  8 23:12 /work/sample
-rw-r--r--. 1 root   root          36M  7月 26 11:28 /work/test.image.bk
-rw-r--r--. 1 root   root          36M  6月 20 19:37 /work/test.image
-rw-r--r--. 1 root   root          98K 11月 16 11:44 /work/20151113_134734_AWSテスト.log
-rw-r--r--. 1 root   root          63K 10月 27 06:44 /work/test7_2.sh

このように、一度容量順でソートした後でも人の見やすい形式に直す事が出来る。
上の例では空白区切り(デフォルト)の5列目を指定しているが、区切り文字も「--delimiter」オプションで指定可能だ。

細かいオプションや使い方については、また後日まとめてみるかもだが、これは非常に便利なコマンドだ。


※追記

うまいこと魅力を伝えられていないようなので追記。
上の例だと分かりにくいが、lsコマンド単体では配下のディレクトリを再帰的にフルパスで一覧取得出来ない。このため、「-S(サイズ順でソート)」では配下のディレクトリにある大きいファイルが見つけられない。
そのためfindと組み合わせ、sortを用いてるのだが、lsで「-h」すると容量は数字として扱えなくなるので、正常にソートされない。

となると、ソート後にファイル容量を変換する必要が出てくる。
そんな時に使えるよ、という例だったのだが、ちょっとわかりにくかったかも知れない。。。