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.