はじめに
こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は、Rubyでファイルモード(パーミッション)を操作するためのメソッド File.chmod
を深掘りし、その仕組みやビット演算によるファイルモードの扱い方について解説します。
ファイルモードの基本
ファイルモード(パーミッション)は、ファイルやディレクトリのアクセス権限を表すもので、以下の3つのグループに分けられます。
グループ名 | 説明 |
---|---|
所有者(user) | ファイルを所有しているユーザーの権限 |
グループ(group) | ファイルが所属するグループのユーザーの権限 |
その他(other) | それ以外の全ユーザーの権限 |
パーミッションのビット表記
パーミッションは通常、8進数または2進数で表されます。以下は、典型的なファイルモードの例です。
-rw-r--r--
これを2進数と8進数に変換すると次のようになります
権限記号 | 2進数表記 | 8進数表記 | 意味 |
---|---|---|---|
rw- |
110 | 6 | 読み取り・書き込み可能 |
r-- |
100 | 4 | 読み取りのみ可能 |
--- |
000 | 0 | 権限なし |
ファイルモード全体は、3つのグループ(所有者、グループ、その他)を連結した形で表現されます。
たとえば、644 は以下を意味します:
- 所有者: 読み取り + 書き込み (rw-)
- グループ: 読み取りのみ (r--)
- その他: 読み取りのみ (r--)
File.chmod
の使い方
Rubyでは、File.chmod
を使ってファイルモードを簡単に変更できます。以下は基本的な使い方です。
filename = "example.txt"
# ファイルを作成
File.write(filename, "Rubyファイルモードの練習")
# ファイルモードを644(読み書き可能 + 読み取り専用)に設定
File.chmod(0644, filename)
# 現在のモードを確認
puts "現在のモード: #{File.stat(filename).mode.to_s(8)}"
出力例は以下の通りです。
現在のモード: 100644
出力の先頭の 10 は通常ファイルを意味します。他にも 04 はディレクトリ、12 はシンボリックリンクを表します。
ファイルモードのビット操作
Rubyでは、ファイルモードをビット演算によって柔軟に操作できます。以下の例では、既存のモードに実行権限を追加してみます。
実行権限の追加例
filename = "example.txt"
# 現在のモードを取得
stat = File.stat(filename)
current_mode = stat.mode
puts "現在のモード: #{current_mode.to_s(8)}"
# 実行権限を追加 (ユーザー、グループ、その他に対して)
new_mode = current_mode | 0111
File.chmod(new_mode, filename)
# 更新後のモードを確認
puts "更新後のモード: #{File.stat(filename).mode.to_s(8)}"
出力例:
現在のモード: 100644
更新後のモード: 100755
0111 は、ユーザー、グループ、その他全員に実行権限を追加することを意味します。
特定の権限を削除する例
次に、グループとその他の書き込み権限を削除してみましょう。
filename = "example.txt"
# 現在のモードを取得
stat = File.stat(filename)
current_mode = stat.mode
puts "現在のモード: #{current_mode.to_s(8)}"
# グループとその他の書き込み権限を削除
remove_write = ~022
new_mode = current_mode & remove_write
File.chmod(new_mode, filename)
# 更新後のモードを確認
puts "更新後のモード: #{File.stat(filename).mode.to_s(8)}"
出力例は以下の通りです
現在のモード: 100755
更新後のモード: 100555
- ビット反転(~)について
022(8進数)は、グループとその他の「書き込み権限」を意味します(2進数では 000000010010)。
~022 を適用すると、すべてのビットが反転されます(2進数では 111111101101)。
たとえば、現在のモードが 100755(2進数で 111110110101)の場合、これに論理積(&)を適用すると次のようになります
111110110101 (現在のモード)
& 111111101101 (~022)
----------------
111110100101 (結果)
この結果は、8進数で 100555 に相当し、グループとその他の書き込み権限が削除された状態を示します。
- 論理積(&)
現在のモードに ~022 を適用すると、グループとその他の書き込み権限だけが削除されます。
まとめ
File.chmod
とビット演算を活用すれば、ファイルモードを効率的に管理できます。
s特にビット操作は、細かな権限変更をスクリプトで実現する際に非常に便利です。