Bash
如何僅對子目錄進行 chmod?
給定以下目錄樹:
. ├── 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 選項首先標記所有命名的目錄workspace
,chmod
然後一次性標記它shopt -s nullglob globstar
選項是確保 glob 擴展在路徑中找不到任何文件時
nullglob
不會引發任何錯誤。這也將確保空的 glob 字元串不包含在數組中。啟用該選項以進行遞歸通配。globstar
現在將shell數組中的這些目錄標記為
dirs=(**/workspace/)
作為進一步的健全性檢查,您可以首先列印數組以查看是否所有需要的目錄都得到了照顧。
printf()
執行以下命令時,查看下面是否列出了所有目錄,printf '%s\n' "${dirs[@]}"
這將使用所有遞歸文件夾填充數組
workspace
,現在我們需要使用chmod
它(( "${#dirs[@]}" )) && chmod -R 774 -- "${dirs[@]}"