1 つのディレクトリ内の inode の最大数はありますか?
200 万を超えるファイルのディレクトリがあり、ls
そのディレクトリに対してコマンドを実行できません。だから今、Linux の inode の制限を超えたのではないかと思っています。2^64 の数値制限の前に制限はありますか?
df -i
ファイルシステムで使用されていて空いているiノードの数がわかります。
ls -U
またはを試してくださいls -f
。
ls
、デフォルトでは、ファイルをアルファベット順に並べ替えます。200万個のファイルがある場合、その並べ替えには長い時間がかかる可能性があります。の場合ls -U
(またはおそらくls -f
)、ファイル名はすぐに出力されます。
いいえ。i ノードの制限はファイルシステムごとであり、ファイルシステムの作成時に決定されます。別の制限に達している可能性があります。または、'ls' がうまく機能していない可能性があります。
これを試して:
tune2fs -l /dev/DEVICE | grep -i inode
あらゆる種類の inode 関連情報が表示されるはずです。
あなたが打つのは、lsの内部制限です。これは非常によく説明する記事です: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with- ls/
ディレクトリの最大サイズはファイルシステムに依存するため、正確な制限は異なります。ただし、非常に大きなディレクトリを持つことは悪い習慣です。
ファイルをサブディレクトリに分類して、ディレクトリを小さくすることを検討してください。一般的なスキームの 1 つは、次のように、最初のレベルのサブディレクトリに最初の 2 文字を使用することです。
${topdir}/aa/aardvark ${topdir}/ai/飛行機
これは、名前付けに UUID、GUID、またはコンテンツ ハッシュ値を使用する場合に特に効果的です。
Rob Adamsが指摘したように、lsはファイルを表示する前に並べ替えています。NFSを使用している場合、NFSサーバーはディレクトリを送信する前にソートし、200万エントリがNFSタイムアウトよりも長くかかる可能性があることに注意してください。これにより、-fフラグを指定しても、NFSを介してディレクトリを一覧表示できなくなります。
これは、他のネットワークファイルシステムにも当てはまる可能性があります。
ディレクトリ内のエントリ数に強制的な制限はありませんが、予想されるエントリにある程度の制限を設けることをお勧めします。
ファイル数の実際のカウントを取得できますか? 2^n 境界のすぐ近くに落ちますか? すべてのファイル名を保持するための RAM が不足している可能性はありますか?
Windows では、フォルダー内のファイル数が増えると、少なくともファイル システムのパフォーマンスが劇的に低下することはわかっていますが、少なくともコマンド プロンプトを使用している場合、Linux ではこの問題は発生しないと思いました。Nautilus のようなものを取得して、その多くのファイルを含むフォルダーを開こうとする場合、神はあなたを助けてくれます。
また、これらのファイルがどこから来たのか疑問に思っています。プログラムでファイル名を計算できますか? その場合、それらをいくつかのサブフォルダーに分類する小さなプログラムを作成できる可能性があります。多くの場合、特定のファイルの名前をリストすると、名前を検索しようとすると失敗する場所へのアクセスが許可されます。たとえば、これが機能する約 85,000 個のファイルを含む Windows のフォルダーがあります。
この手法が成功した場合は、この小さなプログラムを cron ジョブとして実行しているだけであっても、この並べ替えを永続的にする方法を見つけることができます。ファイルをどこかで日付順に並べ替えることができれば、特にうまく機能します。
エラー メッセージが表示されない限り、ls は動作していますが、非常に低速です。次のように、最初の 10 個のファイルだけを見てみることができます。
ls -f | head -10
しばらくファイルの詳細を確認する必要がある場合は、最初にそれらをファイルに入れることができます。おそらく、現在リストしているディレクトリとは別のディレクトリに出力を送信したいでしょう!
ls > ~/lots-of-files.txt
ファイルに何かをしたい場合は、xargs を使用できます。なんらかのスクリプトを作成して作業を行うことにした場合は、スクリプトがファイルのリストを一度にではなく、ストリームとして処理するようにしてください。すべてのファイルを移動する例を次に示します。
ls | xargs -I thefilename mv thefilename ~/some/other/directory
これを head と組み合わせて、より少数のファイルを移動できます。
ls | head -10000 | xargs -I x mv x /first/ten/thousand/files/go/here
ls | head
おそらく、ファイルを管理可能な数のファイルを持つディレクトリの束に分割するシェルスクリプトに組み合わせることができます。
NetBackup の場合、クライアントのディレクトリを分析するバイナリは、すべてのフォルダ (フォルダごとに約 100 万、SAP 作業ディレクトリ) 内の膨大な量のファイルによってタイムアウトになるある種の一覧表示を実行します。
私の解決策は (Charles Duffy がこのスレッドに書いているように)、アーカイブの少ないサブフォルダーにフォルダーを再編成することでした。
別のオプションはfind
次のとおりです。
find . -name * -exec somcommands {} \;
{}
絶対ファイルパスです。
長所/短所は、ファイルが次々に処理されることです。
find . -name * > ls.txt
すべてのファイル名を出力しますls.txt
find . -name * -exec ls -l {} \; > ls.txt
の各ファイルのすべての情報フォーム ls を出力しますls.txt