ディレクトリ内のファイルの「ディレクトリ順序」とは何ですか( `ls -U`によって使用されます)?


19

lsのマニュアルページによると、次のls -Uことを意味します。

ソートしないでください。ディレクトリ順にエントリをリストします。

「ディレクトリの順序」とは何を意味し、どのように決定されますか?

次のテスト(ext3ファイルシステムで実行)は、ファイルが作成された順序ではないことを示しています。

root@sv1010vm0007:/tmp# mkdir test
root@sv1010vm0007:/tmp# touch test/2
root@sv1010vm0007:/tmp# touch test/1
root@sv1010vm0007:/tmp# touch test/3
root@sv1010vm0007:/tmp# ls -U test
2  3  1

回答:


14

ファイルシステムに依存します。一部のファイルシステム(ext3など)の場合、ディレクトリは実際にはよく知られた形式のファイルであり、「d」ビットがその許可またはモードに設定されています。その場合、作成および削除されたファイル名の長さの履歴が重要になります。カーネルは、新しいファイルの名前を保持するのに十分なスペースがあるディレクトリファイルの最初のエントリを埋めます。詳細については、http://e2fsprogs.sourceforge.net/ext2intro.htmlの「Physical Description」というタイトルのセクションを参照してください

他のいくつかのファイルシステム、特にReiserfsの場合、ディレクトリは実際にはファイルシステムでは表示されないB +ツリー内の一部のエントリであるためls、Reiserfsファイルシステム内のディレクトリのプレーンは字句順になっています。


@Bruce:それで、この「ディレクトリ」ファイルの内容は正確に何ですか?
ファヒムミタ

従来、struct direntに非常によく似たもので、RHELボックスとSlackware 11.0ボックスの/usr/include/bits/dirent.hで定義されています。これらのマシンは両方とも、ディレクトリを直接open()することを拒否します。ディレクトリを通常のファイルに変換するために「cat。> dot.as.file」のようなことをしていたことを知っていますが、確かに前回行ったのはSolaris 8でした。基本的に、struct direntには、iノード(数字)、レコード長、名前の長さ、および文字列が含まれています。これらは、ASCII-Nulで終了する場合としない場合があります。
ブルースエディガー

@ブルース:わかりました。そして、このC構造体は、そこに含まれるファイルとサブディレクトリに関するすべての情報をそれらのフィールドに取得しますか?
ファヒムミタ

ext2、BSD FFS、または元のUnixファイルシステムなどのファイルシステムのディレクトリには、iノード番号と対応するファイル名のリストが含まれていました。引数なしで「ls」を呼び出すと、ファイル名のリストが得られました。「ls -l」を実行すると、「ls」自体がファイル名に対してstat(2)システムコールを実行することですべてのファイル名を検索し、struct statからパーミッション、サイズ、「ファイルタイプ」などを取得します。 。つまり、いいえ、ディレクトリファイルにはすべての情報が含まれているわけではなく、名前のリストだけが含まれています。
ブルースエディガー

2
ext2.sourceforge.net/2005-ols/paper-html/node3.htmlは、dir_index機能がファイル名とファイルシステム固有のシークレットをハッシュすることを説明しています。dump2efsは、機能が有効になっている場合、Filesystem機能行にdir_indexを含めます。
マーティンドレイ

3

実際、期待する特定の順序はありません。エントリを好きなように順序付けるのは、OSとファイルシステムの実装次第です。このオプションの目的の1つは、非常に大きなディレクトリで重要な要因になる可能性のある、より高速なリストを取得することです。


カーネルとファイルシステムドライバーには、正確にデータがディスクに書き込まれるタイミングに影響するスケジューリング/キャッシュアルゴリズムがあります。これは、パフォーマンスを向上させるために行われます。この最適化のため、書き込みがいつ発生するかを正確に知ることはできません。また、ファイルシステム内の古いiノードを再利用して、古いファイルがあったディレクトリスロットに新しいファイルを表示できるようにすることもできます。したがって、作成の順序は「ディレクトリの順序」である必要はありません。
ローレンス

@ultrasawblade:なぜそれ自体の返信ではなく、自分の返信へのコメントとしてそれを書いたのかわからない。
jlliagre

@ultrasawblade:厳密に言うと、「古いiノードが再利用されている」とは、古いディレクトリスロットの再利用とは関係ありません。これは、古いディレクトリエントリのリンクが解除されるたびに発生する可能性があります。それらがすべてハードリンクである場合、これによりinodeの割り当てが解除される必要はありません。
G-Manは「Reinstate Monica」と言います

2

エントリがファイルシステムに内部的に保存される順序です。これはファイルシステムごとに異なります。例えば、のentiresのような、バランスの取れた木のいくつかの種類に格納することができる赤黒木。エントリの数が少ないディレクトリに対して、または追加や削除を効率的に処理するために、さらに最適化が行われる場合があります。


-1

ディレクトリは、実際のファイルのメタデータをリストする単なる別のファイルです。「ls -U」は、ディレクトリファイルに同じ順序で全体をリストします。

順序は、OSとファイルシステムの実装によって決まります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.