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

Max*_*mov 19 permissions directory

我需要为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
Run Code Online (Sandbox Code Playgroud)

但如果N大我累了。如何通过一个命令自动完成?

win*_*ner 25

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

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

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

  • @Tim 在使用命令“f=\`readlink -f <relative_path>\`”存储在 f 之前将相对路径转换为绝对路径 (2认同)

Sté*_*las 6

随着cshtcshkshzshbashfishyash -o braceexpand

sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}
Run Code Online (Sandbox Code Playgroud)

zsh

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}
Run Code Online (Sandbox Code Playgroud)

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

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}
Run Code Online (Sandbox Code Playgroud)

例如用作:

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  
Run Code Online (Sandbox Code Playgroud)

请注意,chmod +rx受 umask 影响。如果您umask不包含007,它将使/root目录世界可读和可访问,这是一个坏主意。/root通常用于超级用户的私人事物,暴露它是个坏主意。