僅授予「bin」子目錄中檔案的執行權限

僅授予「bin」子目錄中檔案的執行權限

我有一個父目錄,其中有許多應用程序,每個應用程式都有自己的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避免麻煩的 {} 嵌套。

相關內容