あまブログ

ドキドキ......ドキドキ2択クイ〜〜〜〜〜〜〜ズ!!

【Ruby】File::Stat#modeが返すファイルモードの数値を記号表記に変換する

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

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

ama-tech.hatenablog.com

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

3桁目:特殊権限

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

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

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

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

ama-tech.hatenablog.com

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

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

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

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

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

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

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

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

8進表記 2進表記 記号表記 権限
0 000 --- なし
1 001 --x 実行
2 010 -w- 書き込み
3 011 -wx 書き込み・実行
4 100 r-- 読み込み
5 101 r-x 読み込み・実行
6 110 rw- 読み込み・書き込み
7 111 rwx 読み込み・書き込み・実行

さらにファイルの権限は、所有者(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--
040755 drwxr-xr-x
041755 drwxr-xr-t

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

ama-tech.hatenablog.com


【参考】