0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】File.chomdについて

Posted at

はじめに

こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は、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特にビット操作は、細かな権限変更をスクリプトで実現する際に非常に便利です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?