特定のディレクトリのファイルサイズ分布を知りたいです。
注:ファイルサイズ分布、いいえディレクトリサイズ。つまり、60バイトファイルが25個、12587バイトファイルが50個、57kバイトファイルが2個などがあることを知りたいという意味です。
コマンドライン(リモートシステムなど)で簡単にグラフ化された形式でデータを収集できる場合は、ボーナスポイントになります。
答え1
ファイルを一覧表示し、リストからサイズ(バイト単位)を抽出してソートし、各サイズの発生回数を計算します。
find /my/directory -type f -exec ls -l {} + | cut -d' ' -f5 | sort -n | uniq -c
- あまり効率的ではありません
- ファイルが多い場合は、中間結果を一時ファイルに保存し、別の一時ファイルに並べ替えて「uniq」することをお勧めします。
- ここでは数値ソートを使用するため、出力はファイルのサイズに応じて昇順にソートされますが(大丈夫です)、同じ行が一緒にグループ化されている限り、どのソートも大丈夫です。
- 結果をパイプにリンクして、
awk '{ print $1 "," $2 }'
選択したプロットツールで使用するCSVファイルを取得します(スプレッドシートツールも機能します)。
答え2
Luke404のGNU検索バリエーション:
find . -type f -printf '%s\n' | sort -n | uniq -c
答え3
このPerlコードは、次の場合に役立ちます。
@files = grep {-f} glob "*"; #List files in the current directory
%files;
for(@files)
{
chomp (my $size = \`du -h \"$_\"`);
$size=~ s/\s+.*//; #Remove the file name from the output of du
$files{$size}++; # Add an entry to the hash
}
print "Size,Count\n"; # Print a header
print "${\_},$files{$_}\n" for(keys %files); # Print info in CSV format
次の点に注意してください。
- このコードはファイルをサイズでソートしようとしません(サブルーチンが必要な場合があります)。
- 私は人間が読める出力を得るために
du
代わりにPerlの演算子を使用しています。-s
- 現在のディレクトリ以外のディレクトリの内容を一覧表示するには、目的のディレクトリの名前をコマンドライン引数に変更して指定します
glob "*"
。glob "$ARGV[0]/*"
バッチ操作で複数のディレクトリの内容を一覧表示するには、このコードを
list_dir.pl
次のように保存し、bashラッパーを使用できます。list_dir.pl dir1 > dir1_list.csv list_dir.pl dir2 > dir2_list.csv
あるいは、コードをさらに変更して、複数のディレクトリを引数として受け入れ、検索する各ディレクトリに対してプロセスを分岐することもできます。
私は現在のディレクトリのファイルが1レベルの深さ(再帰なし)であることを望んでいると仮定します。