ファイル番号のカスケードツリー

ファイル番号のカスケードツリー

標準出力にはtreeファイル階層に関する情報が含まれます。このツールにはこれを行うオプションが含まれています。ここで、サイズはすべてのファイルのサイズを追加し、tree --du -h大きなディレクトリを検索できるフォルダ()のみを表示します。

私は同じものを探していますが、数十万のファイルを含む大きなツリーであまり大きくないディレクトリのホットスポットを見つけるためにファイルの数を探しています。

ベストアンサー1

不可能に見えますが、tree次のようにできます。

遅いバージョン

find . -type d -exec bash -c 'printf "%7d   " '\
'$(find "$1" -mindepth 1 -maxdepth 1 -type f -not -type l -printf . | wc -m); '\
'printf "%s\n" "$1"' find {} \; 2>/dev/null |
awk '$1>1000'

ファイル番号(この場合は1,000を超えるファイル番号のみ)とディレクトリパスを印刷します。

私の/ etc(ファイル数のしきい値は50)で実行すると、出力は次のようになります。

    175   .
     70   ./sysconfig
     98   ./apparmor.d/abstractions
     84   ./gconf/gconf.xml.schemas
    122   ./brltty/Text
     76   ./sane.d

エクスプレスバージョン

bu5hmanの答えは、これがどれほど遅いのかわからなかったことに気づきました。

以下は別のアプローチの最適化されたバージョンです。

find . -type f -not -type l -printf '%h\n' 2>/dev/null |
  awk -v th=50 '{ a[$0]++; }; '\
  'END { PROCINFO["sorted_in"]="@unsorted"; for (key in a) if (a[key]<th) delete a[key];'\
  ' PROCINFO["sorted_in"]="@val_num_desc";for (key in a) printf "%7d   %s\n",a[key],key }'
    175   .
    122   ./brltty/Text
     98   ./apparmor.d/abstractions
     84   ./gconf/gconf.xml.schemas
     76   ./sane.d
     70   ./sysconfig

awkフィルタリングできるだけでなく、計算して並べ替えることもできます。計算、フィルタリング、並べ替えなど、正しい順序でこれを行います。そして、ソート、カウント、ファイラーが最悪です。もちろん、これはディレクトリ番号が大きい場合にのみ重要です。

  1. 多数のプロセスが少量のデータを移動し、
  2. 少量またはプロセスでより多くのデータを移動

/ etcに400を超えるディレクトリがあり、サブプロセスのページキャッシュヒット率が(おそらく)100%の場合でも、これは非常に印象的です。

おすすめ記事