设置文件夹及其所有父目录的读写权限


18

我需要设置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很大,我会很累。如何通过一个命令自动执行?


您真的应该使/root世界可读。
斯特凡Chazelas

Answers:


23

这可以在shell中轻松完成,从子目录开始然后向上移动:

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

这从您也设置了f的任何文件/目录开始,并且在每个父目录上都有效,直到遇到“ /”(或在循环条件下设置字符串的任何东西)为止。它不会chmod“ /”。


很好,我知道我在用Perl不必要地使事情复杂化。
terdon

但是,如果f是相对路径,而我想停在相对路径而不是路径上/呢?
所有StackExchange

@StéphaneChazelas谢谢。如果$f是的话foo/bar,会$f改变成.吗?是dirname做的。谢谢
StackExchange对于

1
@Tim使用命令“ f =`readlink -f <relative_path>`”将相对路径转换为绝对路径,然后存储在f中
Talespin_Kit

6

随着cshtcshkshzshbashfishyash -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通常用于超级用户的私人物品,公开它是一个坏主意。


你能解释一下什么是领先,{,/subfolder}呢?
terdon

它创建一个交替,其中第一个字符串为空,第二个字符串为/subfolder; 所以/root{,/subfolder}生产/root/root/subfolder
tripleee

值得注意的是,这对POSIX来说是不可移植的sh
三点

2

好吧,您可以做一些更复杂的事情,例如:

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

1

我不知道您要做什么,但是比您不要轻描淡写要好。也就是说,请阅读实际答案:

嗯...为什么不只使用递归。

sudo chmod -R +rx /root

或者,如果您不喜欢它,则可以指定chmod几个目录:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN

4
但是,这几乎不是同一操作。 chmod -R /root更改所有内容/root包括常规文件和所有目录。问题仅在于更改一个目录链。
200_success

@ 200_success,但这不是唯一的答案;)
Braiam 2013年

问题不是关于递归,而是关于如何在父文件夹链上设置权限以允许对子文件夹的选择性访问。说这不是唯一的答案,就像说开车穿过墙壁是另一扇门一样。
jmc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.