2

Linux/Ubuntu OS は、ハード ドライブに保存されている絶対アドレスを使用してすべてのファイルのエントリを保持するテーブルを作成しますか?

私はファイル検索プログラムを作成することを計画しているので、知りたいだけです。

find などの端末コマンドがあることは知っていますが、CI でプログラムするときに、Ubuntu OS が行うようなことがあるかどうかを考えていました。ある場合、どうすればそのテーブルにアクセスできますか?

アップデート:

一部の人が言ったように、そのようなことはありません.ファイル検索プログラムを作成したい場合は、プログラムのルートディレクトリを開始して、すべてのディレクトリのすべてのフォルダを検索する必要があります. 結果として得られるプログラムは非常に遅くなり、パフォーマンスが低下します! それで、より良い方法はありますか?または私の方法は良いです!

4

5 に答える 5

10

あなたが説明する「もの」は一般にファイルシステムと呼ばれ、Linuxで利用可能なファイルシステムの選択肢があることを知っているかもしれません:ext3、ext4、btrfs、Reiser、xfs、jffsなど。

あなたが説明するテーブルは、おそらく inode-directory コンボに非常によくマップされます。

私の見解では、ファイルが物理的にハードディスク上のどこにあるかの全体的な管理はユーザーの仕事ではありません。それは厳密にはオペレーティング システムのドメインであり、優れた言い訳がない限り (たとえば、データ回復プログラム) と関連するファイル システムの非常に深い知識。さらに、ほとんどの場合、ファイルのストレージは連続しておらず、ディスク上の複数の場所 (フラグメント) に分散しています。

しかし、ここでのより重要な質問は、おそらく、この方法でファイルを検索することによって、正確に何を達成したいのかということです。

編集:OPのコメントに基づいて、ここに重大な誤解があると思います-絶対ファイルアドレスとファイルサーチャーの間のリンクはわかりませんが、それは「絶対アドレス」に対するそれぞれの理解の根本的な違いによるものかもしれませんファイルシステムのコンテキストで。

ファイルシステム内のすべてのファイルを確認したいだけの場合は、次のいずれかを実行できます

  1. 再帰的なディレクトリ読み取りを実行するか、
  2. SmartGuyz が提案するように、updatedb によって準備されたデータベースを使用します

とにかくファイルを調べたいので-そしてそれはほとんどすべてのランタイムが費やされる場所です-私は2)が1)よりも優れているとは考えられません.2)外部依存関係を持つという欠点があります。 updatedb によって準備されたファイルが存在し、非常に新鮮でなければなりません。

古き良き opendir/readdir/closedir よりもディレクトリをトラバースするより高度な方法について話す SO の質問: opendir()、readdir()、closedir() を使用してディレクトリ ツリーを効率的にトラバースする

OPの質問の補遺に基づくEDIT2:はい、ディレクトリのトラバースには時間がかかりますが、それは人生です。次善の策、つまりロケートとフレンドを考えてみましょう。これは、定期的に (通常は 1 日 1 回) 更新される「データベース」に依存するため、最後にスケジュールされた更新に追加または名前変更されたすべてのファイルは検出されず、最後にスケジュールされた更新後に削除されたファイルは、それらはもう存在しませんが、データベース。ターゲットマシンにlocateがインストールされていると仮定しても、確信が持てません。

プログラミングのほとんどの場合と同様に、同じ問題に対する以前の解決策を見るのは決して悪いことではありません。GNU findutilsのドキュメントを読むことをお勧めしますか?

于 2012-10-19T12:25:48.653 に答える
4

いいえ、ファイルのブロック アドレスの単一のテーブルはありません。さらに深くする必要があります。

まず、ファイル レイアウトはファイルシステムの種類 (ext2、ext3、btrfs、reisersf、jfs、xfs など) によって異なります。これは、多くのファイルシステム上のファイルにアクセスするためのドライバーを提供する Linux カーネルによって抽象化され、そのファイルシステムを含む特定のパーティションは、単一の仮想ファイル システム (サブツリーとして他のデバイスを含む単一のファイル ディレクトリ ツリー) の下で抽象化されます。 )。

したがって、基本的にいいえ、カーネル抽象インターフェイス (readdir()など/proc/mounts) を使用してファイルを検索するか、独自のユーザー空間ドライバーを (FUSE などを介して) ロールして、/dev/sda1本当に検査する必要がある場合は raw ブロック デバイス (など) を検査する必要があります。低レベルの詳細 (これには、カーネル/ファイルシステムの内部について多くの理解が必要であり、非常にエラーが発生しやすい)。

于 2012-10-19T12:25:33.630 に答える
2
updatedb -l 0 -o db_file -U source_directory

これにより、ファイルを含むデータベースが作成されます。これが役立つことを願っています。

于 2012-10-19T12:25:18.467 に答える
0

はい。

概念的には、ディスク上のすべてのファイルの場所のテーブルを作成します**。この写真を少し濁らせている詳細がたくさんあります。

ただし、通常は気にしないでください。あなたはそのレベルで働きたくありませんし、あなたもそうすべきではありません。Linuxには多くのファイルシステムがあり、それらはすべてわずかに(または大幅に)異なる方法でそれを実行します。

**実際には物理的な場所ではありません。ハードドライブは、ファームウェアによって何らかの方法で論理ブロックを物理ブロックにマップする場合があります。

于 2012-10-19T21:19:10.990 に答える
0

いいえ。ファイル システムは実際にはディレクトリで構成されており、各ディレクトリにはファイルとディレクトリが含まれています。

Linux 内では、これらすべてが inode を使用してカーネルで管理されます。

于 2012-10-19T12:22:59.870 に答える