平均ファイルサイズを計算する


11

ディレクトリ内の平均ファイルサイズを計算するための便利なワンライナーを探しています。

私が欲しいのは:

すべてのファイルのサイズ/ディレクトリ内のファイル数


ディレクトリ内の各ファイルの平均サイズのように?またはディレクトリのサイズ?
Drake Clarris、2013

ディレクトリ内のファイルの平均サイズ
2013

回答:


3

FreeBSD / Mac OS X findを使用しstatawk(ただし、便利なワンライナーではありません):

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=valueawkとANSI C系列を拡大していきます\n\rシェルがエクスポートを行う一方で... PWDあなたが使用できるように、ENVIRON["PWD"]中にawk自分の名前にバックスラッシュを持つディレクトリの問題のようなものを持っていません。
ステファンChazelas

バイト単位の平均サイズだけが必要な場合は、を使用できますfind . -type f -exec stat -f%z {} +|awk '{s+=$0}END{print s/NR}'
Lri 2014

11

GNU findで:

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

またはディスク使用量の場合:

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

同じファイルの複数のハードリンクがそこにある場合、そのディスク使用量を数回カウントすることに注意してください。

上記は通常のファイルのみをカウントし、シンボリックリンクやディレクトリ、その他の特殊ファイルはカウントしません。隠しファイルが含まれています。

zshビルトインと同じ:

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

1行で単純化したソリューション:

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

これには、ls通常のファイルのデータを構成する「-」で始まる出力行のみを考慮した、構文上のチートがあります。


2

サブディレクトリを無視して、ディレクトリ内のファイルのみ:

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

または、サブディレクトリ内のファイルを含むすべてのファイルを数えるには:

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

サブディレクトリを無視したくない。
2013

いいね 結果を512バイト(ファイルチャンクのデフォルトサイズ)ではなく1024バイト(kb)にするには、du呼び出しに-kを追加するだけです。
Olivier Dulac 2013

2
du -s同じファイルへの余分なハードリンクを除いて、すべてのファイルとディレクトリ、およびその他の通常でないファイルのディスク使用量(サイズではない)を合計しますが、通常のファイルはすべてカウントします。また、改行文字を含むファイル名は数回カウントされます。GNU固有です。OSに応じてセクターまたはキロバイトを報告します。finddu -Sdu -s
ステファンChazelas

いつものように、@ StephaneChazelasは、linux / unixに関する知識に驚かされ、私の迅速かつ汚いソリューションがどれほど汚いかを示しています。linux / unixをどのくらい使用していますか?
Drake Clarris、2013

答えはひどく間違っているため、削除する必要があります。ステファンによって説明されました。
Acumenus 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.