引き続きnumfmtコマンドです。
–toオプションで、バイトの単位変換ができます。
1024 単位の変換なら、–to=iecを指定します。
1024 Byte、1024 * 1024 Byteをそれぞれ単位変換すると、
takk@deb9:~/tmp$ numfmt --to=iec 1024 1.0K takk@deb9:~/tmp$ numfmt --to=iec `expr 1024 \* 1024` 1.0M takk@deb9:~/tmp$
結構大きな単位に対応しているようです。私はP(ペタ)より上は知りませんでした。
takk@deb9:~/tmp$ for i in 1 2 3 4 5 6 7;do numfmt --to=iec `ruby -e "p 1024 ** $i"`;done 1.0K 1.0M 1.0G 1.0T 1.0P 1.0E 1.0Z takk@deb9:~/tmp$
国際単位系(1000単位)なら、–to=siを指定します。
takk@deb9:~/tmp$ numfmt --to=si 1024 1.1K takk@deb9:~/tmp$ numfmt --to=si `expr 1024 \* 1024` 1.1M takk@deb9:~/tmp$
変換したい値は、標準入力で与えてやればよいので、例えば以下のようなファイルがあったとして、読みやすい単位に変換したい場合は、
takk@deb9:~/tmp$ truncate -s 1024 a.bin takk@deb9:~/tmp$ wc -c a.bin 1024 a.bin takk@deb9:~/tmp$
そのままnumfmtに渡せばよいです。
takk@deb9:~/tmp$ wc -c a.bin | numfmt --to=iec 1.0K a.bin takk@deb9:~/tmp$
numfmtが単位変換する対象が、一番最初の列のため、このようにシンプルに指定できます。
全フィールドを変換しようとすると、当然エラーになりますので、
takk@deb9:~/tmp$ wc -c a.bin | numfmt --to=iec --field - 1.0K numfmt: invalid number: `a.bin' takk@deb9:~/tmp$
回避するには、–invalidオプションでignoreを指定すればよいです。
takk@deb9:~/tmp$ wc -c a.bin | numfmt --to=iec --field - --invalid ignore 1.0K a.bin takk@deb9:~/tmp$
ではls -lの結果をnumfmtで変換してみましょう。
takk@deb9:~/tmp$ ls -l a.bin -rw-r--r-- 1 takk takk 1024 5月 13 22:32 a.bin takk@deb9:~/tmp$ takk@deb9:~/tmp$ ls -l a.bin | numfmt --to=iec --field 5 -rw-r--r-- 1 takk takk 1.0K 5月 13 22:32 a.bin takk@deb9:~/tmp$
まあ、lsの場合は、-hオプションがあり、同じ変換をlsがやってくれるので、numfmtの出番はないですけどね。
takk@deb9:~/tmp$ ls -lh a.bin -rw-r--r-- 1 takk takk 1.0K 5月 13 22:32 a.bin takk@deb9:~/tmp$
statでもやってみます。
takk@deb9:~/tmp$ stat a.bin File: a.bin Size: 1024 Blocks: 0 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 546902 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-05-13 22:32:27.257000000 +0900 Modify: 2018-05-13 22:32:13.441000000 +0900 Change: 2018-05-13 22:32:13.441000000 +0900 Birth: - takk@deb9:~/tmp$
Sizeの表示、1024を、numfmtで変換したいと思います。
takk@deb9:~/tmp$ stat a.bin | numfmt --to=iec --field 2 --invalid ignore File: a.bin Size: 1.0K Blocks: 0 IO Block: 4096 通常ファイル Device: 801h/2049d Inode: 546902 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ takk) Gid: ( 1000/ takk) Access: 2018-05-13 22:32:27.257000000 +0900 Modify: 2018-05-13 22:32:13.441000000 +0900 Change: 2018-05-13 22:32:13.441000000 +0900 Birth: - takk@deb9:~/tmp$
2列目の表示に関して、2行目の1024は、数字のみで構成されていました。
一方2行目以外は、数字以外の混合値でしたので、これをnumfmtで変換すると無視され、1024だけが1.0Kに変換されたというわけです。
コメント