フォルダの下
/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache
私たちは100以上の再帰フォルダを持っています。
フォルダの 1 つに数千のファイルが含まれています。このフォルダを認識できますか?
このフォルダには何千ものファイルが含まれており、何千ものファイルがあり、そこにあるファイルを削除できないために問題が発生する可能性があるため、これを尋ねます。
答え1
ディレクトリ内のエントリの数は、以下を使用して計算できます。
set -- *
これは、場所パラメータ(など)を現在のディレクトリの名前$1
に設定します。$2
拡張名の数*
は で確認できます$#
。bash
シェルを使用してdotglob
シェルオプションを設定すると、隠された名前がさらに評価されます。
/grid/sdh/hadoop/yarn/local/usercache/hdfs/appcache
1000を超える名前を含むディレクトリを見つけるには、次のようにします。
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を超えるディレクトリは一覧表示され、入力されません。