如何检查并分配shell脚本文件的执行权限?

如何检查并分配shell脚本文件的执行权限?

我正在编写一个 .sh 脚本,为当前目录和子目录中尚未分配执行权限的所有 .sh 文件分配执行权限。

我只需一个命令即可轻松为当前目录及其子目录中包含的所有 .sh 文件分配执行权限:

find -type f -iname '*.sh' -exec chmod +x {} \;

上面的命令将为当前目录和子目录中的所有 .sh 文件分配执行权限。但我只需要条件语句来检查这个 .sh 文件是否已分配执行权限?如果没有,则执行该文件的分配执行权限命令。

您的回答将非常有帮助,我将非常感谢您的回答。

答案1

我想你正在寻找-executable选项, 否定它-not

$ ls -l
-rwxrwxr-x ... cmd.sh
-rw-rw-r-- ... foo.txt

$ find . -not -executable
./foo.txt

所以对于你的情况,你可以这样做:

find -type f -iname '*.sh' -not -executable -exec chmod +x {} \;

答案2

我尝试使用-perm选项。

find . -perm /a=x 

将在任何地方匹配xa

所以你需要

find . -not -perm /a=x

这是公认答案的一种模糊形式。

您可以使用

find -perm /go=x

匹配ggroup 或other 可执行的文件。

遗憾的是您无法直接测试缺失的位。

答案3

无需检查文件是否可执行。chmod如果文件已具有所分配的权限,则该命令不会失败。通过首先检查文件的权限,您不会保存任何内容。

我建议对命令的唯一更改是chmod为尽可能多的文件调用一次,而不是每个文件调用一次:

find . -name '*.sh' -type f -exec chmod +x {} +

我也把你的非标准-iname测试改成了普通-name测试。我假设您实际上没有混合使用.sh.Sh.sH.SH文件名后缀的文件。如果有,您可能想要修复它们。这是这样做的:

find . -type f -iname '*.sh' ! -name '*.sh' -exec sh -c '
    for pathname do
        mv "$pathname" "${pathname%.??}.sh"
    done' sh {} +

请注意,此处不检查文件名冲突。如果您使用的是 GNU 系统,您可能需要使用mv -b它来生成备份,以防发生名称冲突。与往常一样,首先在备份数据的副本上测试随机人员的代码。

相关内容