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

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

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

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

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

这从您设置的任何文件/目录开始,并对每个父目录起作用,直到遇到“/”(或您在循环条件中设置的字符串)。它不 chmod “/”。确保f循环条件中的 和 目录都是绝对路径。

答案2

csh, tcsh, ksh, zsh, bash,fishyash -o braceexpand:

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

zsh

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

或者您可以定义一个 glob 限定符函数,例如:

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

答案3

我不知道你想做什么,但比你更好不要轻视递归。也就是说,请阅读实际答案:

嗯...为什么不直接使用递归呢。

sudo chmod -R +rx /root

或者如果你不喜欢它,你可以给出chmod几个目录:

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

答案4

好吧,你可以做一些稍微复杂的事情,例如:

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

相关内容