Calcola la dimensione media del file


11

Sto cercando un pratico one-liner per calcolare la dimensione media del file in una directory.

Quello che voglio è:

dimensione di tutti i file / numero di file nella directory


Come nella dimensione media di ciascun file nella directory? o la dimensione della directory?
— Drake Clarris,

La dimensione media di un file in una directory
— taffer

Risposte:


3

Con FreeBSD / Mac OS X find, state awk(non esattamente un comodo one-liner però):

find -x . -type f -maxdepth 1 -exec sh -c 'stat -f '%z' "${@}"' _ '{}' + | 
LC_ALL=C awk -v pwd="${PWD}" '
   BEGIN{ sum=0; count=0; }
   { sum+=$1; ++count; }
   END{ 
        if (count == 0) exit;
        printf ("number of files: %d\n", count); 
        printf ("average file size in B: %.5f\n", sum/count); 
        printf ("average file size in KB: %.5f\n", (sum/count) / 1024); 
        printf ("average file size in MB: %.5f\n", (sum/count) / (1024*1024)); 
        printf ("directory: %s\n", pwd); 
   }
'

Nota che in -v var=value, awkespanderà le sequenze ANSI C come \n, \r... Mentre le shell vengono esportate PWD, quindi puoi usarle ENVIRON["PWD"]in awkcui non c'è quel tipo di problema per le directory che hanno barre rovesciate nel loro nome.
— Stéphane Chazelas,

Se hai solo bisogno della dimensione media in byte, puoi usare find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
— Lri,

11

Con GNU trova:

find . -type f -printf '%s\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s/NR}'

O per l'utilizzo del disco:

find . -type f -printf '%k\n' | awk '{s+=$0}
  END {printf "Count: %u\nAverage size: %.2f\n", NR, s*1024/NR}'

Nota che se ci sono diversi hardlink dello stesso file, questo conterà il suo utilizzo del disco più volte.

Quanto sopra conta solo file regolari, non collegamenti simbolici o directory o altri file speciali. Include file nascosti.

Lo stesso con i zshbuiltin:

zmodload -i zsh/stat
count() {zstat -Hs -- $REPLY; ((size+=$s[size], count++, 0))}
size=0 count=0
**/*(oNDN.+count)
print -f "Count: %s\nAverage size: %.2f\n" $count $(($size./count))

3

Una soluzione semplicistica in una riga:

ls -Rl -- "$DIR" | awk 'BEGIN{sum=0;count=0};/^-/{sum+=$5;++count};END{print sum/count}'

Ha un trucco sintattico, considerando solo lsle righe di output che iniziano con '-', che dovrebbe costituire i dati per i file regolari.


2

solo per i file in una directory, ignorando le sottodirectory:

expr $(du -Ss | cut -f1) / $(find /path/to/dir -maxdepth 1 -type f | wc -l)

Oppure per contare tutti i file inclusi i file nelle sottodirectory:

expr $(du -s | cut -f1) / $(find /path/to/dir -type f | wc -l)

Vorrei non ignorare le sottodirectory.
— Taffer

simpatico. Basta aggiungere -k a du invocation per avere il risultato in 1024 byte (kb) anziché 512 byte (dimensione predefinita di un blocco di file).
— Olivier Dulac,

2
du -ssommerà l' utilizzo del disco (non le dimensioni) di tutti i file e directory e altri file non regolari , escludendo collegamenti extra allo stesso file, mentre findconterà tutti i file normali. Inoltre, i nomi dei file con caratteri di nuova riga verranno conteggiati più volte. du -Sè specifico per GNU. du -ssegnalerà settori o kilobyte a seconda del sistema operativo.
— Stéphane Chazelas,

Come al solito @StephaneChazelas la tua conoscenza di linux / unix mi stupisce e mi mostra quanto sono sporche le mie soluzioni veloci e sporche. Da quanto tempo usi Linux / Unix?
— Drake Clarris,

La risposta è orribilmente sbagliata e dovrebbe essere cancellata. Spiegato da Stephane.
— Acumenus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.