LoginSignup
2
1

More than 3 years have passed since last update.

FileUtilsメソッドのpermission指定は8進数

Last updated at Posted at 2020-06-11

mkdir_p でディレクトリを作る時に、permissionも指定したい...

mkdir_pについて

ディレクトリ dir とその親ディレクトリを全て作成します。

例えば、

require 'fileutils'
FileUtils.mkdir_p('/usr/local/lib/ruby')
は以下の全ディレクトリを (なければ) 作成します。

/usr
/usr/local
/usr/local/bin
/usr/local/bin/ruby

引用
https://docs.ruby-lang.org/ja/latest/class/FileUtils.html#M_MAKEDIRS

permissionを指定して作成してみる

Linuxコマンドだと..
mkdir -p -m 755 ./hoge1/hoge2/hoge3/ruby だから
ruby的には

test.rb
require 'fileutils'

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)

かな?

早速実行

$ ruby test.rb
$ ls -la
d-wxrw--wt    3 casix  staff     96 Jun 12 01:06 hoge1/

いや、明らかに権限は 755 ではない...

mkdir_pのソースコードを読んでみた

fileutils.rb
# File fileutils.rb, line 194
def mkdir_p(list, mode: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
  return *list if noop

  ...
end

modeに入れた引数の処理をよく読むと

mkdir -p #{mode ? ('-m %03o ' % mode) : ''}

とある

#{mode ? ('-m %03o ' % mode) : ''}

が755になっていれば、いいはずだが

'-m %03o ' % mode

modeに755を入れると

irb(main):001:0> mode = 755
=> 755
irb(main):002:0> '-m %03o ' % mode
=> "-m 1363 "

1363が返ってきてしまう

と言うことは...

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)
# ↓
# $ mkdir -p -m 1363 ./hoge1/hoge2/hoge3/ruby

になっていたということ

引数に入れるべきは10進数ではなく、8進数だった

'-m %03o ' % mode

# %03o は 0詰め3桁の8進数で出力するということなので
# modeには755を10進数に変換した数字(493)を入れる

irb(main):001:0> mode = 0o755
=> 493
irb(main):002:0> '-m %03o ' % mode
=> "-m 755 "

いけそう

修正してみる

FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 0o755)

# FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 0755) でもおk
$ ls -la
drwxr-xr-x    3 casix  staff     96 Jun 12 01:43 hoge1/

755で設定出来てそう!

mkdir_pに関わらず、FileUtilsでは、permissionの設定は8進数だった

そもそもmkdir_pに限らなかった
FileUtilsでpermissionを指定出来るメソッドは全て同じ仕様みたい

(ちなみに0から始まる時は、8進数になるという知識は忘れがち...)

2
1
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
2
1