GNU/Linux >> Znalost Linux >  >> Linux

Standardní nástroj pro převod počtu bajtů na lidský Kib Mib atd.; Jako Du, Ls1?

Existuje standardní nástroj který převádí celočíselný počet bajtů na lidsky čitelný počet o největší možné jednotkové velikosti, přičemž zachovává číselnou hodnotu mezi 1,00 a 1023,99 ?

Mám svůj vlastní bash/awk skript, ale hledám standardní nástroj, který se nachází v mnoha/většině distribucí... něco obecněji dostupného a v ideálním případě má jednoduché argumenty příkazového řádku a/nebo může přijímat vstup z potrubí.

Zde je několik příkladů typu výstupu, který hledám.

    1    Byt  
  173.00 KiB  
   46.57 MiB  
    1.84 GiB  
   29.23 GiB  
  265.72 GiB  
    1.63 TiB  

Zde je bytes-human skript (používá se pro výše uvedený výstup)

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%sn", pfix, num, unit[uix], sfix ) 
   }'

Aktualizovat Zde je upravená verze Gilles' skript, jak je popsáno v komentáři k jeho odpovědi ..(upraveno tak, aby vyhovovalo mému preferovanému vzhledu).

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"%sn", x, s)
      }
      {gsub(/^[0-9]+/, human($1)); print}'

Přijatá odpověď:

Ne, takový standardní nástroj neexistuje.

Od GNU coreutils 8.21 (únor 2013, takže ještě není přítomen ve všech distribucích), na neembedded Linuxu a Cygwin, můžete použít numfmt . Neprodukuje přesně stejný výstupní formát (od coreutils 8.23 ​​si nemyslím, že můžete dostat 2 číslice za desetinnou čárkou).

$ numfmt --to=iec-i --suffix=B --padding=7 1 177152 48832200 1975684956
     1B
 173KiB
  47MiB
 1.9GiB

Tento formát dokáže vytvořit mnoho starších nástrojů GNU a třídění GNU dokáže třídit čísla s jednotkami od verze coreutils 7.5 (srpen 2009, tedy v moderních nezabudovaných distribucích Linuxu).

Váš kód mi připadá trochu zamotaný. Zde je čistší verze awk (výstupní formát není přesně identický):

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}'

(Převzato ze specializovanější otázky)

Související:Proč nikdo nepoužívá skutečný Bourne shell jako /bin/sh?
Linux
  1. Sloučit / převést více souborů PDF do jednoho PDF

  2. Převeďte výstup ls na csv

  3. Jak převést PDF do JPG pomocí příkazového řádku v Linuxu?

  1. Progress – Malý nástroj pro sledování průběhu (cp, mv, dd, tar atd.) příkazů v Linuxu

  2. Jak převedu obraz disku Linux na řídký soubor?

  3. Jak převést konkrétní text ze seznamu na velká písmena?

  1. Používání nástroje GNOME Screenshot Tool v Linuxu jako profesionál

  2. Převést pevný odkaz na symbolický odkaz?

  3. Převést soukromý klíč Openssh na soukromý klíč Ssh2?