58

すべての inode を消費する原因となっているディレクトリを特定するにはどうすればよいですか?

最終的には、ルート ディレクトリが最大数の inode を担当することになるため、どのような回答が必要なのか正確にはわかりません..

基本的に、使用可能な inode が不足しており、不要なディレクトリを見つけて選別する必要があります。

ありがとう、漠然とした質問でごめんなさい。

4

16 に答える 16

90

新しいファイルを作成したくない場合 (または inode を使い果たしたために作成できない場合)、次のクエリを実行できます。

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

インサイダーが別の回答で述べたように、再帰的な ls は非常に遅いため、find でソリューションを使用するとはるかに高速になります。そのソリューションについては以下を確認してください。(クレジットは当然のことです!)

于 2012-01-21T16:37:22.310 に答える
45

再帰的なlsで提供されるメソッドは非常に遅いです。私が使用したほとんどのinodeを消費している親ディレクトリをすばやく見つけるためだけに:

cd /partition_that_is_out_of_inodes
for i in *; do echo -e "$(find $i | wc -l)\t$i"; done | sort -n
于 2013-01-18T03:03:01.163 に答える
21

つまり、基本的に、どのディレクトリに多くのファイルがあるかを探していますか? ここに最初の刺し傷があります:

find . -type d -print0 | xargs -0 -n1 count_files | sort -n

ここで、「count_files」はシェルスクリプトです (thanks Jonathan)

echo $(ls -a "$1" | wc -l) $1
于 2008-12-07T14:29:49.433 に答える
6

これを行う簡単な Perl スクリプトを次に示します。

#!/usr/bin/perl -w

use strict;

sub count_inodes($);
sub count_inodes($)
{
  my $dir = shift;
  if (opendir(my $dh, $dir)) {
    my $count = 0;
    while (defined(my $file = readdir($dh))) {
      next if ($file eq '.' || $file eq '..');
      $count++;
      my $path = $dir . '/' . $file;
      count_inodes($path) if (-d $path);
    }
    closedir($dh);
    printf "%7d\t%s\n", $count, $dir;
  } else {
    warn "couldn't open $dir - $!\n";
  }
}

push(@ARGV, '.') unless (@ARGV);
while (@ARGV) {
  count_inodes(shift);
}

次のように動作させたい場合du(各ディレクトリ カウントにはサブディレクトリの再帰カウントも含まれます)、再帰関数を に変更return $countし、再帰ポイントで次のように言います。

$count += count_inodes($path) if (-d $path);
于 2008-12-07T15:51:11.237 に答える
1
for i in dir.[01]
行う
    find $i -printf "%i\n"|sort -u|wc -l|xargs echo $i --
終わり

dir.0 -- 27913
dir.1 -- 27913

于 2013-06-07T23:06:16.777 に答える
1

ディレクトリ サイズを使用して間接的に検索することもできます。たとえば、次のようになります。

find /path -type d -size +500k

大きなディレクトリがたくさんある場合は、500k を増やすことができます。

このメソッドは再帰的ではないことに注意してください。これは、1 つのディレクトリに多数のファイルがある場合にのみ役立ちますが、ファイルがその子孫に均等に分散されている場合には役立ちません。

于 2014-01-06T14:23:36.797 に答える
0

最終的にいくつかのメールスプールディレクトリを見つけて、そこにあるジャンクをすべて削除したい場合、ファイルが多すぎると rm * は機能しません。次のコマンドを実行して、そのディレクトリ内のすべてをすばやく削除できます。

* 警告 *これにより、rm が機能しない場合に備えて、すべてのファイルが迅速に削除されます

find . -type f -delete
于 2015-02-03T22:59:24.860 に答える
0

perl スクリプトは優れていますが、シンボリック リンクに注意してください - -l filetest が false を返した場合にのみ再帰するか、せいぜいオーバーカウントし、最悪の場合、無期限に再帰します (これは、マイナーな懸念事項です - サタンの 1000 年の治世を呼び起こす可能性があります)。

ファイル システム ツリー内の inode を数えるという全体的な考え方は、少数のファイルへの複数のリンクが存在する場合には崩壊します。

于 2013-11-02T02:10:18.570 に答える
-2

このコマンドは、ディレクトリ構造が私のものと同じであるという非常にまれなケースで機能します。

find / -type f | grep -oP '^/([^/]+/){3}' | sort | uniq -c | sort -n

于 2014-10-11T00:09:10.267 に答える