GNU/Linux >> Znalost Linux >  >> Linux

Vygenerujte distribuci velikostí souborů z příkazového řádku

Zdá se, že to funguje docela dobře:

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

Jeho výstup vypadá takto:

         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
kde číslo vlevo je spodní mez rozsahu od této hodnoty do dvojnásobku této hodnoty a číslo vpravo je počet souborů v tomto rozsahu.


Na základě garyjohnovy odpovědi je zde jeden řádek, který také formátuje výstup tak, aby byl čitelný pro člověka:

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

Zde je jeho rozšířená verze:

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

V prvním awk Definoval jsem minimální velikost souboru, abych shromáždil všechny soubory menší než 1 kb na jedno místo. Ve druhém awk , funkce human(x) je definována tak, aby vytvořila velikost čitelnou pro člověka. Tato část je založena na jedné z odpovědí zde:https://unix.stackexchange.com/questions/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1

Ukázkový výstup vypadá takto:

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

Zkuste toto:

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 

VÝSTUP:

 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

VYSVĚTLENÍ:

  • find . -type f -exec ls -lh {} \; :dost jednoduché, najděte soubory v aktuálním adresáři a spusťte ls -lh na nich

  • match($5,/([0-9.]+)([A-Z]+)/,k); :tím se extrahuje velikost souboru a každá shoda se uloží do pole k .

  • if(!k[2]){print "1K"} :pokud k[2] není definováno, velikost souboru je <1 kB. Protože si myslím, že vás nezajímají tak malé velikosti, skript vypíše 1K pro všechny soubory, jejichž velikost je <=1 kB.

  • else{printf "%.0f%s\n",k[1],k[2]} :pokud je soubor větší než 1 kB, zaokrouhlte velikost souboru na nejbližší celé číslo a vytiskněte spolu s jeho modifikátorem (K, M nebo G).

  • sort | uniq -c :spočítá výskyty každého vytištěného řádku (velikost souboru).

  • sort -hk 2 :řazení podle druhého pole ve formátu čitelném pro člověka. Tímto způsobem 7G je řazeno po 8M .


Linux
  1. Generujte hesla na příkazovém řádku Linuxu

  2. Základní příklady příkazu File v Linuxu

  3. Jak vygenerovat částečný kontrolní součet souboru

  1. Používání Disku Google z příkazového řádku systému Linux

  2. Přesměrování obsahu souboru na příkaz „echo“?

  3. Jak získat adresu URL souboru Dropbox z příkazového řádku?

  1. Jak odstranit Bom ze souboru UTF-8?

  2. Io Redirection and the Head Command?

  3. Jak připojit výstup do souboru?