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ı
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ı
Yanıtlar:
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);
}
'
-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ığı.
find . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'.
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))
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 .
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)
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.