2008-09-11

ディレクトリーにだけ実行属性を付けたい

Unix にて。ディレクトリー foo 以下の全てのファイルを誰にでも読めるやうにしたい。

ファイルを「誰でも読める」やうにするには、chmode を次のやうに使う。

$ chmod o+r foo.txt

o (other:全員) に r (read:読み込み属性) を与える。

ディレクトリー下、全てのファイルに適用するには -R (再帰) オプションを使う。

$ chmod -R o+r foo/

ただし、ディレクトリーには「読み込み属性 (r)」の他に「実行属性 (x)」もないと、ディレクトリー以下を読めないという制限がある。つまり、上のコマンドを実行しただけでは、foo/bar 以下は読めないかもしれないといふこと。ディレクトリーに実行属性も与えたい。かうしてみやう。

$ chmod -R o+rx foo/

今度は普通のファイルにも実行属性を付与してしまう。

やりたいことは、2 つ。

  1. 全てのファイルとディレクトリーに読み込み属性を与える
  2. ディレクトリーにだけ実行属性を与える

find を使う方法

find の type オプションでディレクトリー (d) を指定する方法。

$ chmod -R o+r foo/
$ find foo/ -type d -exec chmod o+x {} \;

find と xargs を使う方法

find の -exec が苦手な人に。。。

$ chmod -R o+r foo/
$ find foo/ -type d | xargs chmod o+x

chmod の X を使う

実行属性を x (小文字) でなく X (大文字) で与える。

$ chmod -R o+rX foo/

X は、ディレクトリーに対しては x と同じ。ファイルに対しては、実行属性を持つものにだけ実行属性を付与する。

$ ls foo.txt         ; foo.txt は x を一つも持たない
-rw-r--r-- 1 ataka 0 2008-09-12 foo.txt
$ chmod o+X foo.txt
$ ls foo.txt         ; o+X しても何も変わらない
-rw-r--r-- 1 ataka 0 2008-09-12 foo.txt
$ chmod 654 foo.txt
$ ls foo.txt         ; group に x を与える
-rw-r-xr-- 1 ataka 0 2008-09-12 foo.txt
$ chmod o+X foo.txt
$ ls foo.txt         ; どこかに x があると、o+X で x が付く
-rw-r-xr-x 1 ataka 0 2008-09-12 foo.txt

X は意図しないファイルにも実行属性を与えることがあるので、ケース・バイ・ケースでお使いあれ。

ref

No comments:

Post a Comment