lsやstatなどのコマンドはファイル形式をどのように区別しますか?

lsやstatなどのコマンドはファイル形式をどのように区別しますか?

lsやstatのようなコマンドは、オブジェクトがファイルであるかディレクトリであるかに関係なく、ファイルタイプをどのように区別しますか?

statたとえば、私はディレクトリもファイルであるという事実を考慮して、これら2つのオブジェクトを作成しました。いくつかの特別な規則を使用して、出力で「ディレクトリ」と「一般的な空のファイル」として表示する方法を知りたいです。 ""コマンド。

$ mkdir testdir;touch testfile
$ stat testdir | head -2;stat testfile | head -2
 File: `testdir'
 Size: 4096            Blocks: 8          IO Block: 4096   directory
 File: `testfile'
 Size: 0               Blocks: 0          IO Block: 4096   regular empty file

後でtestdirディレクトリとtestfileファイルのstatをそれぞれ実行するときにstraceを実行しました。トレース出力で私はこれを見つけました。

lstat("testdir/", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0

そして

lstat("testfile", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0

st_mode誰かがこの値のS_IFDIR合計を取得する方法を教えてくださいS_IFREG

混乱しているように見えるかもしれません。

ベストアンサー1

皆さんの混乱を解消してみましょう。 st_modeには、inodestat / lstat(および64ビットバリアント)から返される16ビットフィールドがあります。 9ビットはrwxrwxrwx権限に使用され、3ビットはおよびに使用されますsticky bit。残りの4ビットはいくつかのタイプ情報をエンコードするために使用されます。これは、一般的なファイル、ディレクトリ、ブロックまたは文字デバイス、名前付きパイプなどと言えます。set group id (sgid) bitset userid (suid) bit

したがって、ディレクトリを作成する場合、この4ビットはディレクトリであることを示します。 strace出力でこれを確認できます。

lstat("testdir/", {st_mode=S_IFDIR|0775, st_size=4096, ...})
                           ^^^^^^^ 4 bits showing the type is directory
                                   ^ 3 bits (this is octal) for suid/sgid/sticky
                                    ^^^ rwxrwxrwx info.

おすすめ記事