如何仅对子目录进行 chmod?

如何仅对子目录进行 chmod?

给定以下目录树:

.
├── 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 {} \;

相关内容