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