GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ein Standard-Tool zum Konvertieren einer Byte-Anzahl in Human Kib Mib usw.; Wie Du, Ls1?

Gibt es ein Standard-Tool die eine ganzzahlige Anzahl von Bytes in eine für Menschen lesbare Anzahl der größtmöglichen Einheitsgröße umwandelt, während der numerische Wert zwischen 1,00 und 1023,99 ?

bleibt

Ich habe mein eigenes Bash/awk-Skript, aber ich suche nach einem Standard Tool, das auf vielen/den meisten Distributionen zu finden ist … etwas allgemeiner verfügbares und idealerweise einfache Befehlszeilenargumente hat und/oder Pipe-Input akzeptieren kann.

Hier sind einige Beispiele für die Art der Ausgabe, nach der ich suche.

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

Hier ist der bytes-human script (wird für die obige Ausgabe verwendet)

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

Aktualisieren Hier ist eine modifizierte Version von Gilles Skript, wie in einem Kommentar zu seiner Antwort beschrieben ... (an mein bevorzugtes Aussehen angepasst).

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

Akzeptierte Antwort:

Nein, ein solches Standardtool gibt es nicht.

Seit GNU Coreutils 8.21 (Februar 2013, also noch nicht in allen Distributionen vorhanden) können Sie auf nicht eingebettetem Linux und Cygwin numfmt verwenden . Es erzeugt nicht genau das gleiche Ausgabeformat (ab Coreutils 8.23 ​​glaube ich nicht, dass Sie 2 Stellen nach dem Komma erhalten können).

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

Viele ältere GNU-Tools können dieses Format erzeugen und GNU Sort kann seit Coreutils 7.5 (August 2009, also auf modernen nicht eingebetteten Linux-Distributionen vorhanden) Zahlen mit Einheiten sortieren.

Ich finde deinen Code etwas verworren. Hier ist eine sauberere awk-Version (das Ausgabeformat ist nicht genau identisch):

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

(Umgepostet von einer spezielleren Frage)

Verwandte:Warum verwendet niemand die echte Bourne-Shell als /bin/sh?
Linux
  1. Verwenden des GNOME-Screenshot-Tools unter Linux wie ein Profi

  2. Konvertieren Sie ein Graustufenbild in ein Alphakanalbild in der Unix-Shell

  3. Wie kann ich ein chmod im etc-Verzeichnis zurücksetzen?

  4. Wie konvertiert man bestimmten Text aus einer Liste in Großbuchstaben?

  5. So konvertieren Sie eine TAR-Datei in eine ISO-Datei

Konvertieren Sie Ihre Windows-Installation in eine VM unter Linux

Progress – Ein winziges Tool zum Überwachen des Fortschritts für (cp, mv, dd, tar usw.) Befehle in Linux

So verwandeln Sie GIMP in Photoshop

So konvertieren Sie Bilder in das ASCII-Format unter Linux

Wie konvertiere ich ein Linux-Festplatten-Image in eine Sparse-Datei?

Gibt es ein GUI-Tool zum Konfigurieren von /etc/fstab?