![如何仅对子目录进行 chmod?](https://linux22.com/image/129761/%E5%A6%82%E4%BD%95%E4%BB%85%E5%AF%B9%E5%AD%90%E7%9B%AE%E5%BD%95%E8%BF%9B%E8%A1%8C%20chmod%EF%BC%9F.png)
给定以下目录树:
.
├── d1
│ └── workspace
├── d2
│ └── workspace
├── d3
│ └── workspace
├── d4
│ └── workspace
└── d5
└── workspace
我需要设置所有 workspace
目录的权限,如下所示:
chmod -R 774 d1/工作区
chmod -R 774 d2/工作区
...
如何通过一个命令对所有workspace
目录执行上述操作?我可以运行以下命令:
chmod -R 774 *
但这也改变了父目录的模式,这是不希望的。
答案1
您可以在顶级目录上使用通配符。
chmod 774 d*/workspace
或者为了使其更具体,您还可以限制通配符,例如后跟d
一个数字。
chmod 774 d[0-9]/workspace
更通用的方法可能是使用find
.
find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;
答案2
该chmod
命令有一个很好的快捷方式,用于仅在目录上设置可执行位,如下所示:
chmod a+X *
这非常方便,可以使整个目录树可供任何人读取,但不会在任何常规文件上设置可执行位:
chmod -R a+rX *
答案3
在像这样的 shell 中,您可以使用其扩展的 globbing 选项首先一次性bash
标记所有指定的目录workspace
和它chmod
shopt -s nullglob globstar
该选项nullglob
是为了确保全局扩展在执行时不会抛出任何错误不是找到路径中的任何文件。此外,这将确保空的全局字符串不包含在数组中。该globstar
选项已启用以进行递归通配。
现在将 shell 数组中的这些目录标记为
dirs=(**/workspace/)
作为另一项健全性检查,您可以首先打印数组以查看是否已处理所有所需的目录。当您执行以下命令时,查看下面是否列出了所有目录printf()
,
printf '%s\n' "${dirs[@]}"
这将用所有递归文件夹填充数组workspace
,现在我们需要使用chmod
它
(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"
答案4
find . -mindepth 1 -type d -exec chmod 774 {} \;