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には、inode
stat / lstat(および64ビットバリアント)から返される16ビットフィールドがあります。 9ビットはrwxrwxrwx権限に使用され、3ビットはおよびに使用されますsticky bit
。残りの4ビットはいくつかのタイプ情報をエンコードするために使用されます。これは、一般的なファイル、ディレクトリ、ブロックまたは文字デバイス、名前付きパイプなどと言えます。set group id (sgid) bit
set 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.