Oblicz średni rozmiar pliku


11

Szukam poręcznego jedno-liniowego narzędzia do obliczania średniego rozmiaru pliku w katalogu.

Chcę to:

rozmiar wszystkich plików / liczba plików w katalogu


Jak w średnim rozmiarze każdego pliku w katalogu? lub rozmiar katalogu?
Drake Clarris

Średnia wielkość pliku w katalogu
taffer

Odpowiedzi:


3

Z FreeBSD / Mac OS X find, stati awk(nie dokładnie poręcznej jedną wkładką chociaż):

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

Należy zauważyć, że w -v var=value, awkposzerzy sekwencje ANSI C, jak \n, \r... Podczas muszle zrobić eksport PWD, dzięki czemu można korzystać ENVIRON["PWD"]w awkktórych nie ma tego rodzaju problem dla katalogów zawierających backslashy w ich imieniu.
Stéphane Chazelas

Jeśli potrzebujesz tylko średniej wielkości w bajtach, możesz użyć find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri

11

Z GNU znajdź:

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

Lub do użycia dysku:

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

Zauważ, że jeśli jest tam kilka dowiązań twardych tego samego pliku, policzy to użycie jego dysku kilka razy.

Powyższe dotyczy tylko zwykłych plików, a nie dowiązań symbolicznych, katalogów lub innych plików specjalnych. Zawiera ukryte pliki.

To samo z zshwbudowanymi:

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

Uproszczone rozwiązanie w jednej linii:

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

Zawiera w sobie cheat składniowy, biorąc pod uwagę tylko lslinie wyjściowe zaczynające się od „-”, co powinno stanowić dane dla zwykłych plików.


2

tylko dla plików w katalogu, ignorując podkatalogi:

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

Lub policzyć wszystkie pliki, w tym pliki w podkatalogach:

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

Nie chcę ignorować podkatalogów.
taffer

miły. Wystarczy dodać -k do du wywołania, aby uzyskać wynik w 1024 bajtach (kb) zamiast 512 bajtów (domyślny rozmiar fragmentu pliku).
Olivier Dulac

2
du -sdoda się na użycie dysku (nie rozmiar) wszystkich plików i katalogów i innych nieregularnych plików , z wyłączeniem dodatkowych twardych linków do tego samego pliku, natomiast findbędą się liczyć wszystkie zwykłe pliki. Również nazwy plików ze znakami nowej linii będą liczone kilka razy. du -Sjest specyficzny dla GNU. du -szgłasza sektory lub kilobajty w zależności od systemu operacyjnego.
Stéphane Chazelas

Jak zwykle @StephaneChazelas twoja wiedza na temat linux / unix zaskakuje mnie i pokazuje, jak brudne są moje szybkie i brudne rozwiązania. Jak długo używasz Linuksa / Unixa?
Drake Clarris

Odpowiedź jest strasznie błędna i powinna zostać usunięta. Wyjaśnione przez Stephane.
Acumenus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.