du, ls1 など、バイト数を人間の KiB MiB などに変換する標準ツールです。

du, ls1 など、バイト数を人間の KiB MiB などに変換する標準ツールです。

お持ちですか?標準ツール数値は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}'

より専門的な質問から再投稿)

おすすめ記事