GNU/Linux >> Linux の 問題 >  >> Linux

i ノードの使用場所を特定する

解決策 1:

これがすぐに実行されるとは思わないでください...

大量の inode を含むサブディレクトリがあると思われるディレクトリに移動します。このスクリプトに非常に長い時間がかかる場合は、ファイル システム内のどこを見ればよいかを見つけた可能性があります。 /var は良いスタートです...

それ以外の場合は、そのファイル システムの最上位ディレクトリに移動してこれを実行し、完了するまで待つと、すべての inode を含むディレクトリが見つかります。

find . -type d | 
while 
  read line  
do 
  echo "$( find "$line" -maxdepth 1 | wc -l) $line"  
done | 
sort -rn | less

仕分けの費用も気になりません。テストを実行したところ、350,000 個のディレクトリに対して未ソートの出力をソートするのに 8 秒かかりました。最初の発見にかかった。本当のコストは、while ループでこれらすべてのディレクトリを開くことです。 (ループ自体には 22 秒かかります)。 (テスト データは、350,000 のディレクトリを持つサブディレクトリで実行されました。そのうちの 1 つには 100 万のファイルがあり、残りは 1 ~ 15 のディレクトリでした)。

さまざまな人が、ls は出力をソートするため、あまり得意ではないことを指摘していました。私はエコーを試しましたが、それも素晴らしいことではありません。他の誰かが、stat はこの情報 (ディレクトリ エントリの数) を提供するが、移植性がないことを指摘していました。 find -maxdepth は、ディレクトリを開くのが非常に高速であり、.files をカウントすることがわかりました。そのため、..ここに..すべてのポイントがあります!

解決策 2:

ファイルが多すぎる 1 つのディレクトリに問題がある場合は、次の簡単な解決策があります:

# Let's find which partition is out of inodes:
$ df -hi
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3               2.4M    2.4M       0  100% /
...

# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d

findの考え方 ディレクトリのサイズは、そのディレクトリ内に直接あるファイルの量に比例するということです。そのため、ここでは、内部に大量のファイルがあるディレクトリを探します。

数字を推測したくなくて、すべての疑わしいディレクトリを「サイズ」順にリストしたい場合、それも簡単です:

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

解決策 3:

Grrr、コメントには 50 担当者が必要です。したがって、この回答は実際には chris の回答に対するコメントです。

質問者はおそらくすべてのディレクトリを気にするわけではなく、最悪のディレクトリだけを気にするので、並べ替えを使用すると非常にコストがかかりすぎる可能性があります。

find . -type d | 
while 
  read line  
do 
  echo "$(ls "$line" | wc -l) $line"  
done | 
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]'  | less

これはあなたのバージョンほど完全ではありませんが、行が以前の最大値よりも大きい場合に行を印刷し、印刷されるノイズの量を大幅に減らし、ソートの費用を節約します.

これの欠点は、2 つの非常に大きなディレクトリがあり、最初のディレクトリの i ノードが 2 番目のディレクトリより 1 つ多い場合、2 番目のディレクトリが表示されないことです。

より完全な解決策は、表示された上位 10 個の値を追跡し、それらを最後に出力する、よりスマートな perl スクリプトを作成することです。しかし、それはサーバー障害の迅速な回答には長すぎます。

また、中程度にスマートな perl スクリプトを使用すると、while ループをスキップできます。ほとんどのプラットフォームでは、ls によって結果がソートされますが、大きなディレクトリでは非常にコストがかかる可能性があります。ここでは ls ソートは必要ありません。気にするのはカウントだけだからです。

解決策 4:

この小さなスニペットを使用できます:

find | cut -d/ -f2 | uniq -c | sort -n

現在のフォルダーの各ディレクトリにあるファイルとディレクトリの数が出力され、最大の違反者が下部に表示されます。多くのファイルがあるディレクトリを見つけるのに役立ちます。 (詳細)

解決策 5:

これはあなたの質問に対する直接的な回答ではありませんが、find を使用して最近変更された小さなサイズのファイルを検索すると、検索が絞り込まれる可能性があります:

find / -mmin -10 -size -20k

Linux
  1. プロのようにLinuxでファイルとディレクトリを探す

  2. ある場所にあるすべてのディレクトリを幅優先で再帰的に一覧表示するにはどうすればよいですか?

  3. recursive grep:特定のディレクトリを除外します

  1. Linux の「検索」コマンドのガイド

  2. 特定の数のファイルを含むディレクトリを検索する

  3. サブディレクトリなしでディレクトリのみを見つける方法は?

  1. inode の使用を解放する方法は?

  2. C で実行可能ファイルの場所を見つけるにはどうすればよいですか?

  3. Linuxでディレクトリをループする方法は?