この記事では、RubyのFile::Stat#modeが返すファイルモードの数値と、記号表記(symbolic notation)の対応を解説します。

ファイルモードの記号表記については以下の記事を参照ください。

【ls -l】ファイルタイプとファイルモードの記号の意味 | あまブログ

1. File::Stat#modeが返す値

fs = File::Stat.new('sample.txt')

p fs.mode #=> 33188
p fs.mode.to_s(8) #=> "100644"

File::Stat#modeはファイルモードを10進数の数値で返します。(33188)

これを意味のわかるものにするためには、8進表記の文字列に変換する必要があります。("100644")

2. 8進表記と記号表記の対応

ここからは8進表記の文字列と記号表記の対応を解説していきます。

先ほど出てきた100644を記号表記に変換すると以下のようになります。

8進表記記号表記
100644-rw-r--r--

この6桁の8進表記はそれぞれの桁ごとに以下の意味を持ちます。

  • 1~2桁目:ファイルタイプ
  • 3桁目:特殊権限
  • 4桁目:所有者の権限
  • 5桁目:グループの権限
  • 6桁目:その他のユーザの権限

以降で8進表記の各桁と記号表記の対応について詳しく解説していきます。

1~2桁目:ファイルタイプ

File::Stat#modeが返す6桁の8進表記の1~2桁目はファイルタイプを表します。

ファイルタイプの8進表記と記号表記の対応は以下のようになります。

8進表記記号表記ファイルタイプ
01p名前付きパイプ(FIFO)
02cキャラクタデバイス(Character special file)
04dディレクトリ(Directory)
06bブロックデバイス(Block special file)
10-通常ファイル(Regular file)
12lシンボリックリンク(Symbolic link)
14sソケット(Socket link)

3桁目:特殊権限

File::Stat#modeが返す6桁の8進表記の3桁目は特殊権限を表します。

特殊権限の8進表記と記号表記の対応は以下のようになります。

8進表記記号表記特殊権限
0なしなし
1tまたはTスティッキービット
2sまたはSSGID(Set Group ID)
4sまたはSSUID(Set User ID)

特殊権限については以下で詳しく解説しています。

【ls -l】ファイルタイプとファイルモードの記号の意味 | あまブログ

4~6桁目:ファイルモード(権限)

まずはファイルモード(権限)の説明を行います。

ファイルモードには「読み込み」「書き込み」「実行」の3種類が存在します。

この3種類の権限の8進表記と記号表記の対応は以下のようになります。

8進表記記号表記権限
0-なし
1x実行
2w書き込み
4r読み込み

このそれぞれの権限は3桁の2進数の各桁に対応づけられており、権限のあるなしを0か1かで判断しています。

8進表記2進表記記号表記権限
0000-なし
1001x実行
2010w書き込み
4100r読み込み

この3種類の権限は同時に持つことができるため、以下の8通り(2の3乗)のパターンが考えられます。

8進表記2進表記記号表記権限
0000---なし
1001--x実行
2010-w-書き込み
3011-wx書き込み・実行
4100r--読み込み
5101r-x読み込み・実行
6110rw-読み込み・書き込み
7111rwx読み込み・書き込み・実行

さらにファイルの権限は、所有者(owner)、グループ(group)、その他のユーザー(other)の3種類のクラスに分かれます。

この3種類のクラスに対して上述の8通りの権限が割り当てられます。

話を戻して、File::Stat#modeが返す6桁の8進表記の4~6桁目(100644644)の各桁は以下のクラスの権限を表します。

  • 4桁目:所有者の権限
  • 5桁目:グループの権限
  • 6桁目:その他のユーザの権限

つまり644は、所有者が読み込み・書き込み権限(rw-)、グループが読み込み権限(r--)、その他のユーザが読み出し権限(r--)を持つことになります。

ここまでの説明をまとめると以下の8進表記と記号表記の対応の意味もわかってくるかと思います。

8進表記記号表記
100644-rw-r--r--
040755drwxr-xr-x
041755drwxr-xr-t

8進表記を記号表記に変換するロジックについては以下の記事で解説しています。

【Ruby3.1】lsコマンドを作る - あまブログ


【参考】