お持ちですか?標準ツール数値は1.00から1023.99?間を維持しながら、整数バイト数を人間が読める最大の単位サイズ数に変換します。
独自のbash/awkスクリプトがありますが、基準多くの/ほとんどのディストリビューションに見られるツール...より一般的に利用可能なツールであり、理想的には単純なコマンドライン引数を持ち、パイプ入力を受け入れることができます。
以下は、私が探している出力タイプのいくつかの例です。
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
ここにいるバイト人間スクリプト(上記の出力の場合)
awk -v pfix="$1" -v sfix="$2" 'BEGIN {
split( "Byt KiB MiB GiB TiB PiB", unit )
uix = uct = length( unit )
for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
}{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
num = $1 / (val[uix]+1)
if( uix==1 ) n = "%5d "; else n = "%8.2f"
printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix )
}'
修正する 修正版ですザイルズ彼の答えへのコメントで述べたように、スクリプト..(私の好きな外観に合わせて修正されました)。
awk 'function human(x) {
s=" B KiB MiB GiB TiB EiB PiB YiB ZiB"
while (x>=1024 && length(s)>1)
{x/=1024; s=substr(s,5)}
s=substr(s,1,4)
xf=(s==" B ")?"%5d ":"%8.2f"
return sprintf( xf"%s\n", x, s)
}
{gsub(/^[0-9]+/, human($1)); print}'
ベストアンサー1
POSIXにはそのようなものはありませんが、最新のGNU coreutilsには数値フォーマッタがあります。numfmt
少なくとも例の出力に近い。 GNU coreutils ≥8.24(2015年、サポート寿命が非常に長い最も古いバージョンを除くすべての非組み込みLinuxに存在):
$ numfmt --to=iec-i --suffix=B --format="%9.2f" 1 177152 48832200 1975684956
1.00B
173.00KiB
46.58MiB
1.84GiB
多くの古いGNUツールはこのフォーマットを生成するかもしれません。GNUソートでは、数値を単位でソートできます。coreutils 7.5基準(2009年8月、ほぼすべての非埋め込みLinuxディストリビューションにあります)。
コードが少し複雑だと思います。以下はよりきれいなawkバージョンです(出力フォーマットはまったく同じではありません)。
awk '
function human(x) {
if (x<1000) {return x} else {x/=1024}
s="kMGTEPZY";
while (x>=1000 && length(s)>1)
{x/=1024; s=substr(s,2)}
return int(x+0.5) substr(s,1,1)
}
{sub(/^[0-9]+/, human($1)); print}'