sharoa’s blog

ただいま勉強中。

lsコマンド / File::Stat#modeを使って記号表記を目指そう。

lsコマンドのことを忘れないために、 続けてlsコマンドについて記します📝


lsコマンド / ロングフォーマットのファイルタイプとファイルモードとはなんぞや?

の最後の方にも書いたが、

ファイルモードってls -lを実行したから

drwxr-xr-xといった記号表記で表してくれているけど、

そのコマンドのプログラムを作ろうと思ったら、

記号表記にするための何かが必要になる。

そこで File::Stat#modeを使う🙂

(例)

fs = File::Stat.new('dir')

p fs.mode #=> 16877
p fs.mode.to_s(8) #=> "40755"
p fs.ftype  #=>"dir"

(例)を参照に、

File::Stat#modeはファイルモードを10進数の数値で返してくれる。(16877)

これを記号表記drwxr-xr-xにするための、意味のわかるものにするために

fs.mode.to_s(8)で8進表記の文字列に変換する必要がある。("40755")

fs.ftypeを実行するとファイルタイプを教えてくれる🤓("dir")※余談

ちなみに

File::Stat.new('dir')

File.lstat('dir')という方法でもインスタンスが作れるが

挙動が異なる場合があるので使うときは注意が必要。

8進表記の文字列がわかったら

それを元に記号表記に変換していく作業が必要となる。

☆目指すところ☆

8進表記の40755を記号表記drwxr-xr-xにする。

その前に、

8進表記で、最初が0の場合だと省かれて5桁になる。

40755も本来なら040755と表して欲しいところだが、

File::Stat#modeが整数を返してきて、それをto_s(8)したところで、

最初が0だったらそりゃ表示されない。🙃

なので、プログラムを作る時にこの8新表記を5桁のままでいくか、あえて6桁にするか、

そこは個々の好みだと思う。(ちなみに私は6桁にした🤫)

8新表記の意味

それぞれ下記の意味を持つ。

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

(例)の040755を参照すると(6桁で考えるため0を足している🙇‍♀️)

ファイルの種類 特殊権限 所有者の権限 グループの権限 その他のユーザの権限
04 0 7 5 5
d 各組のx部分 rwx r-x r-x

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

8進表記の1~2桁目はファイルタイプを表す。

それぞれの対応は以下である。

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(ソケット)

7種類のファイルタイプがあるけど、 d-lが大体のメインどころみたい。

3桁目:特殊権限

8進表記の3桁目は特殊権限を表す。 それぞれの対応は以下である。

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

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

ファイルモードには「読み込み」「書き込み」「実行」の3種類の権限がある。

そして、それぞれの権限は 3桁の2進表記の各桁に対応づけられていて、

権限のあるなしを0か1かで判断している。

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

この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 読み込み、書き込み、実行

ファイルの権限は所有者グループその他のユーザ の3組に分かれているため、

それぞれの組に対して上記の8通りの権限が割り当てられる。

上記の内容から(例)の8進表記040755を改めて読み解くと

ファイルはディレクトリー、特殊権限はなし、

所有者が読み込み・書き込み・実行の権限を持ち(rwx)

グループが読み込み・実行の権限を持ち(r-x)

その他のユーザが読み込み・実行の権限を持つ(r-x)

ということになる。

上記の内容が分かれば、 (例)とは違う8進表記や記号表記が表示されても、

それぞれの意味など理解ができるかと思う。


ただのつぶやき

lsコマンドでこのロングフォーマットのところは

ほんと、念入りに調べた。

とてつもなく疲れたのも覚えてる。

とりあえず、lsコマンドについてはこれで終わり。

次のカリキュラムはwcコマンドやねん。

考える前から頭痛くなりそう🫠