GNU/Linux >> Belajar Linux >  >> Linux

Menghasilkan distribusi ukuran file dari command prompt

Ini tampaknya bekerja dengan cukup baik:

find . -type f -print0 | xargs -0 ls -l | awk '{size[int(log($5)/log(2))]++}END{for (i in size) printf("%10d %3d\n", 2^i, size[i])}' | sort -n

Keluarannya terlihat seperti ini:

         0   1
         8   3
        16   2
        32   2
        64   6
       128   9
       256   9
       512   6
      1024   8
      2048   7
      4096  38
      8192  16
     16384  12
     32768   7
     65536   3
    131072   3
    262144   3
    524288   6
   2097152   2
   4194304   1
  33554432   1
 134217728   4
di mana angka di sebelah kiri adalah batas bawah rentang dari nilai tersebut hingga dua kali nilai tersebut dan angka di sebelah kanan adalah jumlah file dalam rentang tersebut.


Berdasarkan jawaban garyjohn, berikut ini adalah satu baris, yang juga memformat keluaran agar dapat dibaca manusia:

find . -type f -print0 | xargs -0 ls -l | awk '{ n=int(log($5)/log(2)); if (n<10) { n=10; } size[n]++ } END { for (i in size) printf("%d %d\n", 2^i, size[i]) }' | sort -n | awk 'function human(x) { x[1]/=1024; if (x[1]>=1024) { x[2]++; human(x) } } { a[1]=$1; a[2]=0; human(a); printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'

Ini adalah versi yang diperluas:

find . -type f -print0                                                   \ 
 | xargs -0 ls -l                                                        \
 | awk '{ n=int(log($5)/log(2));                                         \
          if (n<10) n=10;                                                \
          size[n]++ }                                                    \
      END { for (i in size) printf("%d %d\n", 2^i, size[i]) }'           \
 | sort -n                                                               \ 
 | awk 'function human(x) { x[1]/=1024;                                  \
                            if (x[1]>=1024) { x[2]++;                    \
                                              human(x) } }               \
        { a[1]=$1;                                                       \ 
          a[2]=0;                                                        \
          human(a);                                                      \
          printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }' 

Di awk pertama Saya menentukan ukuran file minimum untuk mengumpulkan semua file kurang dari 1kb ke satu tempat. Di awk kedua , fungsi human(x) didefinisikan untuk membuat ukuran yang dapat dibaca manusia. Bagian ini didasarkan pada salah satu jawaban di sini:https://unix.stackexchange.com/questions/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -seperti-du-ls1

Output sampel terlihat seperti:

  1k:    335
  2k:     16
 32k:      5
128k:     22
  1M:     54
  2M:     11
  4M:     13
  8M:      3

Coba ini:

find . -type f -exec ls -lh {} \; | 
 gawk '{match($5,/([0-9.]+)([A-Z]+)/,k); if(!k[2]){print "1K"} \
        else{printf "%.0f%s\n",k[1],k[2]}}' | 
sort | uniq -c | sort -hk 2 

KELUARAN :

 38 1K
 14 2K
  1 30K
  2 62K
  12 2M
  2 3M
  1 31M
  1 46M
  1 56M
  1 75M
  1 143M
  1 191M
  1 246M
  1 7G

PENJELASAN :

  • find . -type f -exec ls -lh {} \; :cukup sederhana, cari file di direktori saat ini dan jalankan ls -lh pada mereka

  • match($5,/([0-9.]+)([A-Z]+)/,k); :ini akan mengekstrak ukuran file, dan menyimpan setiap kecocokan ke dalam larik k .

  • if(!k[2]){print "1K"} :jika k[2] tidak ditentukan ukuran file adalah <1K. Karena saya membayangkan Anda tidak peduli dengan ukuran sekecil itu, skrip akan mencetak 1K untuk semua file yang ukurannya <=1K.

  • else{printf "%.0f%s\n",k[1],k[2]} :jika file lebih besar dari 1K, bulatkan ukuran file ke bilangan bulat terdekat dan cetak bersama pengubahnya (K,M, atau G).

  • sort | uniq -c :hitung kemunculan setiap baris (ukuran file) yang dicetak.

  • sort -hk 2 :urutkan menurut bidang kedua dalam format yang dapat dibaca manusia. Lewat sini, 7G diurutkan setelah 8M .


Linux
  1. Hasilkan kata sandi di baris perintah Linux

  2. Cara Menggunakan Perintah Tar di Linux

  3. Menggunakan Google Drive dari Baris Perintah Linux

  1. Mengarahkan Isi File Ke Perintah "echo"?

  2. Pengalihan Io Dan Perintah Kepala?

  3. Bagaimana cara menambahkan output ke file?

  1. Bagaimana Cara Menghapus Bom Dari File Utf-8?

  2. Contoh Penting dari Perintah File di Linux

  3. cara menghasilkan alamat MAC acak dari baris perintah Linux