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コマンドやねん。
考える前から頭痛くなりそう🫠