我有一個父目錄,其中有許多應用程序,每個應用程式都有自己的bin
子目錄
parent
--app1
--bin
--(maybe some other bins on even lower level)
--app2
--bin
...
我想要做的是為其中的文件添加可執行權限,bin
但不為資料夾本身添加可執行權限。
上面的結構雖然不規則(所以我不能只使用循環來預測bin
特定深度/級別上存在 a )。
到目前為止我所擁有的是這樣的:
find /parent -type d -iname "bin" -exec chmod -R a+x {} \;
chmod -R
我知道對每個都進行操作沒有什麼壞處bin
,但為了找到更乾淨的方法,我只想將其應用於+x
文件。
答案1
有必要允許x
目錄:列出目錄(從而在其中找到文件)是權限x
代表目錄的含義。
也就是說,使用
-exec chmod -R a+x {}/* \;
將x
僅分配給目錄的內容,而不是目錄本身。
如果您想滿足巢狀bin
目錄的需求,請使用類似的內容
while read F; do \
test -f "$F" || continue \
test $(basename $(dirname "$F")) == "bin" || continue \
chmod a+x "$F" \
done < find /path/to/base -type f
答案2
有幾種方法:
正如 Eugen 所提到的,目錄上的 +x 是正常的 - 甚至需要它才能存取內容。如果腳本是全域可執行的,那麼繼續使用目前方法並使目錄也可以全域遍歷是有意義的。
您可以依靠 bash 的擴展 glob 來收集
bin
任意深度的所有目錄:shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
相同但沒有類型檢查:
shopt -s globstar; chmod -R a+x **/bin/
使用多個
find
呼叫:find . -type d -name bin | while read -r path; do find "$path/" -type f -exec chmod a+x {} \; done
(這假設你的檔案名稱沒有換行符;如果有,你應該擔心 - 並且你應該調整範例以使用
-print0
等等。)不幸的是,您不能直接嵌套
find -exec
在另一個 內find -exec
,但您可以呼叫一個隨後調用 find -exec 的腳本:find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
這使用
-execdir
而不是-exec
避免麻煩的 {} 嵌套。