GNU/Linux >> Linux Esercitazione >  >> Linux

Genera la distribuzione delle dimensioni dei file dal prompt dei comandi

Questo sembra funzionare piuttosto bene:

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

Il suo output è simile a questo:

         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
dove il numero a sinistra è il limite inferiore di un intervallo da quel valore al doppio di quel valore e il numero a destra è il numero di file in quell'intervallo.


Sulla base della risposta di garyjohn, ecco una riga, che formatta anche l'output in leggibile dall'uomo:

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

Eccone la versione espansa:

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

Nel primo awk Ho definito una dimensione minima del file per raccogliere tutti i file inferiori a 1kb in un unico posto. Nel secondo awk , funzione human(x) è definito per creare una dimensione leggibile dall'uomo. Questa parte si basa su una delle risposte qui:https://unix.stackexchange.com/questions/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1

L'output di esempio è simile a:

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

Prova questo:

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 

USCITA :

 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

SPIEGAZIONE :

  • find . -type f -exec ls -lh {} \; :abbastanza semplice, trova i file nella directory corrente ed esegui ls -lh su di essi

  • match($5,/([0-9.]+)([A-Z]+)/,k); :questo estrarrà la dimensione del file e salverà ogni corrispondenza nell'array k .

  • if(!k[2]){print "1K"} :se k[2] non è definito la dimensione del file è <1K. Dato che immagino che non ti importi di dimensioni così piccole, lo script stamperà 1K per tutti i file la cui dimensione è <=1K.

  • else{printf "%.0f%s\n",k[1],k[2]} :se il file è più grande di 1K, arrotonda la dimensione del file all'intero più vicino e stampa insieme al suo modificatore (K, M o G).

  • sort | uniq -c :conta le occorrenze di ogni riga (dimensione del file) stampata.

  • sort -hk 2 :ordina in base al secondo campo in formato leggibile dall'uomo. In questo modo, 7G è ordinato dopo 8M .


Linux
  1. Utilizzo di Google Drive dalla riga di comando di Linux

  2. Reindirizzamento del contenuto di un file al comando "eco"?

  3. Esempi essenziali del comando file in Linux

  4. Come cancellare il contenuto di un file dalla riga di comando?

  5. Come ottenere l'URL del file Dropbox dalla riga di comando?

Come utilizzare il comando md5sum in Linux

Come utilizzare il comando touch in Linux

Come utilizzare il comando head di Linux

Come usare il comando diff di Linux

Visualizza il contenuto di un file nella riga di comando di Linux

Salva l'output di un comando dal terminale Debian in un file