何千ものファイルを含む大規模ディレクトリを検索するには?

何千ものファイルを含む大規模ディレクトリを検索するには?

フォルダの下

/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache

私たちは100以上の再帰フォルダを持っています。

フォルダの 1 つに数千のファイルが含まれています。このフォルダを認識できますか?

このフォルダには何千ものファイルが含まれており、何千ものファイルがあり、そこにあるファイルを削除できないために問題が発生する可能性があるため、これを尋ねます。

答え1

ディレクトリ内のエントリの数は、以下を使用して計算できます。

set -- *

これは、場所パラメータ(など)を現在のディレクトリの名前$1に設定します。$2拡張名の数*は で確認できます$#bashシェルを使用してdotglobシェルオプションを設定すると、隠された名前がさらに評価されます。

/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache1000を超える名前を含むディレクトリを見つけるには、次のようにします。

find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache \
    -type d -exec bash -O dotglob -c '
        for pathname do
            set -- "$pathname"/*
            if [ "$#" -gt 1000 ]; then
                printf "%d\t%s\n" "$#" "$pathname"
            fi
        done' bash {} +

これは*、見つかった各ディレクトリのシェルglobを展開し、ディレクトリに1000を超える名前がある場合は、名前の数とともにディレクトリのパス名を印刷します。これはbash、一括ディレクトリに対して短いスクリプトを実行することによって行われます。スクリプトは各ディレクトリの配置を繰り返し、各ディレクトリに対して*その中のglobを展開して項目数を計算します。該当する場合は、ifステートメントがトリガーされますprintf

ディレクトリに百万*名前が異なるため、そのディレクトリで実際にglobを拡張するのに時間がかかることがあります。

答え2

GNUシステムでは

(export LC_ALL=C
  find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -print0 |
    tr '\n\0' '\0\n' |
    sed 's|/[^/]*$||' |
    sort |
    uniq -c |
    sort -rn |
    head |
    tr '\z' '\n')

エントリが最も多い10個のディレクトリが一覧表示されます。

ディレクトリにファイルが多すぎてリストすることさえ費用がかかる場合は、ファイルを入力せずにサイズだけを見て推測してみることができます。

 find /grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache -type d \
   -size +10000000c -print -prune

10MBを超えるディレクトリは一覧表示され、入力されません。

関連情報