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つのコマンドで自動的に行う方法は?
これはシェルで簡単に行うことができ、サブディレクトリから始めて上に移動します。
f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;
これは、fを設定したファイル/ディレクトリから始まり、 "/"(またはループの条件で文字列を設定したもの)が見つかるまで、すべての親ディレクトリで機能します。 "/"はchmodしません。ループの条件にあるf
とディレクトリの両方が絶対パスであることを確認してください。
csh
、tcsh
、ksh
、zsh
、bash
、fish
または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の影響を受けることに注意してください。 umask
に007
が含まれていない場合、/root
ディレクトリが世界中から読み取り可能でアクセス可能になるため、これは悪い考えです。 /root
は通常、スーパーユーザーのプライベートなものであり、公開することはお勧めしません。
まあ、あなたは少し複雑なことをすることができます:
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
私はあなたが何をしようとしているのかわかりませんが、あなたよりはましです再帰を軽くとらないでください。とはいえ、実際の答えを読んでください:
うーん...なぜ再帰を使用しないのですか?.
Sudo chmod -R +rx /root
または、それが気に入らない場合は、chmod
にいくつかのディレクトリを指定できます。
Sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN