GNU/Linux >> Belajar Linux >  >> Linux

Alat Standar Untuk Mengubah Hitungan Byte Menjadi Manusia Kib Mib Dll; Seperti Du, Ls1?

Apakah ada alat standar yang mengubah hitungan bilangan bulat Bytes menjadi hitungan yang dapat dibaca manusia dari ukuran unit terbesar yang mungkin, sambil menjaga nilai numerik antara 1,00 dan 1023,99 ?

Saya memiliki skrip bash/awk saya sendiri, tetapi saya mencari standar alat, yang ditemukan di banyak/sebagian besar distro… sesuatu yang lebih umum tersedia, dan idealnya memiliki argumen baris perintah sederhana, dan/atau dapat menerima input yang disalurkan.

Berikut adalah beberapa contoh jenis keluaran yang saya cari.

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

Ini byte-manusia script (digunakan untuk output di atas)

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

Perbarui Ini adalah versi modifikasi dari Gilles' skrip, seperti yang dijelaskan dalam komentar untuk jawabannya ..(dimodifikasi agar sesuai dengan tampilan pilihan saya).

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

Jawaban yang Diterima:

Tidak, tidak ada alat standar seperti itu.

Sejak GNU coreutils 8.21 (Feb 2013, jadi belum ada di semua distribusi), di Linux dan Cygwin non-embedded, Anda dapat menggunakan numfmt . Itu tidak menghasilkan format output yang persis sama (pada coreutils 8.23, saya rasa Anda tidak bisa mendapatkan 2 digit setelah titik desimal).

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

Banyak alat GNU yang lebih tua dapat menghasilkan format ini dan pengurutan GNU dapat mengurutkan angka dengan unit sejak coreutils 7.5 (Agustus 2009, jadi hadir pada distribusi Linux non-embedded modern).

Saya menemukan kode Anda agak berbelit-belit. Ini versi awk yang lebih bersih (format keluaran tidak persis sama):

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

(Diposting ulang dari pertanyaan yang lebih khusus)

Terkait:Mengapa tidak ada yang menggunakan shell Bourne yang sebenarnya sebagai /bin/sh?
Linux
  1. Kemajuan – Alat Kecil untuk Memantau Kemajuan untuk (cp, mv, dd, tar, dll.) Perintah di Linux

  2. Menggunakan Alat Tangkapan Layar GNOME di Linux Seperti Pro

  3. Ubah keluaran ls menjadi csv

  1. Bagaimana cara mengubah PDF menjadi JPG dengan baris perintah di Linux?

  2. Bagaimana cara mengonversi image disk Linux menjadi file jarang?

  3. Bagaimana saya bisa mengembalikan chmod pada direktori dll?

  1. Ubah Hardlink Menjadi Tautan Simbolik?

  2. Ubah Kunci Pribadi Openssh Menjadi Kunci Pribadi Ssh2?

  3. Gifski – Konversikan Video dengan Cepat ke Gif Berkualitas Tinggi