Ortalama dosya boyutunu hesapla


11

Bir dizindeki ortalama dosya boyutunu hesaplamak için kullanışlı bir tek katlı arıyorum.

Ne istiyorum:

tüm dosyaların boyutu / dizindeki dosya sayısı


Dizindeki her dosyanın ortalama boyutunda olduğu gibi? veya dizinin boyutu?
Drake Clarris

Bir dizindeki bir dosyanın ortalama boyutu
taffer

Yanıtlar:


3

FreeBSD / Mac OS X findile statve awk(tam olarak kullanışlı bir tek astar değil):

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

O Not -v var=value, awkANSI C dizileri genişleyecektir \n, \r... kabukları ihracat yapmak iken PWDkullanabilirsiniz, böylece ENVIRON["PWD"]de awkkendi adlarına tersbölüleri sahip dizinler için sorun bu tür sahip olmadığı.
Stéphane Chazelas

Sadece bayt cinsinden ortalama boyuta ihtiyacınız varsa kullanabilirsiniz find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
Lri

11

GNU find ile:

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

Veya disk kullanımı için:

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

İçinde aynı dosyanın birkaç sabit bağlantısı varsa, disk kullanımını birkaç kez sayar.

Yukarıdaki yalnızca sembolik dosyaları, dizinleri veya dizinleri veya diğer özel dosyaları saymaz. Gizli dosyalar içerir.

zshBuildins ile aynı :

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

Tek satırda basit bir çözüm:

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

İçinde sadece lsnormal dosyalar için veri olması gereken '-' ile başlayan çıktı satırları göz önüne alındığında sözdizimsel bir hile vardır .


2

yalnızca bir dizindeki dosyalar için alt dizinleri yok sayarak:

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

Veya alt dizinlerdeki dosyalar dahil tüm dosyaları saymak için:

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

Alt dizinleri göz ardı etmemek istiyorum.
taffer

Güzel. Sonucu 512bayt yerine 1024bayt (kb) (bir dosya yığınının varsayılan boyutu) elde etmek için -k çağrışımını ekleyin.
Olivier Dulac

2
du -syukarı katacak disk kullanımını tüm dosyaların (değil boyutunda) ve dizinleri olmayan diğer normal dosyalar ise, aynı dosya için ekstra sert bağlantıları hariç findtüm düzenli dosyaları sayar. Ayrıca, yeni satır karakterleri içeren dosya adları birkaç kez sayılır. du -SGNU'ya özgüdür. du -sişletim sistemine bağlı olarak sektörleri veya kilobaytları bildirir.
Stéphane Chazelas

@StephaneChazelas her zamanki gibi linux / unix hakkındaki bilginiz beni hayrete düşürüyor ve hızlı ve kirli çözümlerimin ne kadar kirli olduğunu gösteriyor. Ne zamandır linux / unix kullanıyorsunuz?
Drake Clarris

Yanıt korkunç bir şekilde yanlış ve silinmesi gerekiyor. Stephane tarafından açıklandı.
Acumenus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.