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に入れた引数の処理をよく読むと
.rb
mkdir -p #{mode ? ('-m %03o ' % mode) : ''}
とある
.rb
#{mode ? ('-m %03o ' % mode) : ''}
が755になっていれば、いいはずだが
.rb
'-m %03o ' % mode
modeに755を入れると
.rb
irb(main):001:0> mode = 755
=> 755
irb(main):002:0> '-m %03o ' % mode
=> "-m 1363 "
1363が返ってきてしまう
と言うことは...
.rb
FileUtils.mkdir_p('./hoge1/hoge2/hoge3/ruby', mode: 755)
# ↓
# $ mkdir -p -m 1363 ./hoge1/hoge2/hoge3/ruby
になっていたということ
引数に入れるべきは10進数ではなく、8進数だった
.rb
'-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 "
いけそう
修正してみる
.rb
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進数になるという知識は忘れがち...)