Bash

如何僅對子目錄進行 chmod?

  • September 2, 2019

給定以下目錄樹:

.
├── d1
│   └── workspace
├── d2
│   └── workspace
├── d3
│   └── workspace
├── d4
│   └── workspace
└── d5
   └── workspace

我需要為所有 workspace目錄設置權限,如下所示:

chmod -R 774 d1/工作區

chmod -R 774 d2/工作區

如何在一個命令中對所有workspace目錄執行上述操作?我可以執行以下命令:

chmod -R 774 *

但這也改變了父目錄的模式,這是不希望的。

您可以在頂級目錄中使用萬用字元。

chmod 774 d*/workspace

或者為了更具體,您還可以限制萬用字元,例如d後跟一個數字。

chmod 774 d[0-9]/workspace

更通用的方法是使用find.

find d* -maxdepth 1 -name workspace -type d -exec chmod 774 "{}" \;

在像您這樣的 shell中,bash您可以使用其擴展的 globbing 選項首先標記所有命名的目錄workspacechmod然後一次性標記它

shopt -s nullglob globstar

選項是確保 glob 擴展在路徑中找不到任何文件nullglob不會引發任何錯誤。這也將確保空的 glob 字元串不包含在數組中。啟用該選項以進行遞歸通配。globstar

現在將shell數組中的這些目錄標記為

dirs=(**/workspace/)

作為進一步的健全性檢查,您可以首先列印數組以查看是否所有需要的目錄都得到了照顧。printf()執行以下命令時,查看下面是否列出了所有目錄,

printf '%s\n' "${dirs[@]}"

這將使用所有遞歸文件夾填充數組workspace,現在我們需要使用chmod

(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"

引用自:https://unix.stackexchange.com/questions/431881