我正在编写一个 .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
将在任何地方匹配x
位a
所以你需要
find . -not -perm /a=x
这是公认答案的一种模糊形式。
您可以使用
find -perm /go=x
匹配g
group 或o
ther 可执行的文件。
遗憾的是您无法直接测试缺失的位。
答案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
它来生成备份,以防发生名称冲突。与往常一样,首先在备份数据的副本上测试随机人员的代码。