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
,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;}
或者您可以定义一个 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