仅授予“bin”子目录中文件的执行权限

仅授予“bin”子目录中文件的执行权限

我有一个父目录,其中包含多个应用程序,每个应用程序都有自己的bin子目录

parent
--app1
  --bin
  --(maybe some other bins on even lower level)
--app2
  --bin
...

我想要做的是为文件夹内的文件添加可执行权限,bin但不为文件夹本身添加可执行权限。

但是,上述结构并不规则(所以我不能仅使用循环来预测bin特定深度/级别的结构)。

到目前为止我所拥有的是这样的:

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来避免麻烦的 {} 嵌套。

相关内容