web-dev-qa-db-ja.com

フォルダとそのすべての親ディレクトリに読み取りおよび書き込み権限を設定します

rootユーザーの読み取りおよび書き込み権限をsubfolderNまでのディレクトリrootおよびそのすべての親フォルダーに設定する必要があります。

手でできる:

$ Sudo chmod +rx /root/subfolder1/subfolder2/subfolderN
$ Sudo chmod +rx /root/subfolder1/subfolder2
$ Sudo chmod +rx /root/subfolder1
$ Sudo chmod +rx /root

しかし、Nが大きい場合、私は疲れています。 1つのコマンドで自動的に行う方法は?

19
Maxim Yefremov

これはシェルで簡単に行うことができ、サブディレクトリから始めて上に移動します。

f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;

これは、fを設定したファイル/ディレクトリから始まり、 "/"(またはループの条件で文字列を設定したもの)が見つかるまで、すべての親ディレクトリで機能します。 "/"はchmodしません。ループの条件にあるfとディレクトリの両方が絶対パスであることを確認してください。

24

cshtcshkshzshbashfishまたはyash -o braceexpandの場合:

Sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}

zshの場合:

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}

または、次のようなグロブ修飾子関数を定義することもできます。

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}

たとえば、次のように使用します。

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  

chmod +rxはumaskの影響を受けることに注意してください。 umask007が含まれていない場合、/rootディレクトリが世界中から読み取り可能でアクセス可能になるため、これは悪い考えです。 /rootは通常、スーパーユーザーのプライベートなものであり、公開することはお勧めしません。

6

まあ、あなたは少し複雑なことをすることができます:

echo "/root/subfolder1/subfolder2/subfolderN" | 
 Perl -anF'/' -e 'while($#F>0){@b=join("/",@F);`chmod +rx @b`; pop @F}' 

これがどうなるかを確認するには、chmod呼び出しをprintに置き換えます。

$ echo "/root/subfolder1/subfolder2/subfolderN" | 
 Perl -alnF'/' -e 'while($#F>0){@b=join("/",@F);print "chmod +rx @b"; pop @F}' 
chmod +rx /root/subfolder1/subfolder2/subfolderN
chmod +rx /root/subfolder1/subfolder2
chmod +rx /root/subfolder1
chmod +rx /root
2
terdon

私はあなたが何をしようとしているのかわかりませんが、あなたよりはましです再帰を軽くとらないでください。とはいえ、実際の答えを読んでください:

うーん...なぜ再帰を使用しないのですか?.

Sudo chmod -R +rx /root

または、それが気に入らない場合は、chmodにいくつかのディレクトリを指定できます。

Sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
1
Braiam