我有一个父目录,其中包含多个应用程序,每个应用程序都有自己的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
来避免麻烦的 {} 嵌套。