真正可靠的做法是用 find 找全脚本再由 xargs 安全赋权:find . -name "*.sh" -type f -print0 | xargs -0 chmod +x,其中-print0/-0处理特殊字符,-type f避免误操作目录。

直接用 chmod +x *.sh 只能处理当前目录,多层嵌套时会漏掉子目录里的脚本。真正可靠的做法是让 find 找全、xargs 安全执行。
基础写法:安全匹配 + 批量赋权
这是最常用也最稳妥的组合:
find . -name "*.sh" -type f -print0 | xargs -0 chmod +x
其中:
-name "*.sh" 精准匹配以 .sh 结尾的文件;
-type f 排除目录、链接等非普通文件,避免误操作;
-print0 / -0 用空字符分隔路径,完美兼容含空格、括号、中文的文件名。
按需细化权限范围
如果只想给所有者加执行权(更安全),把 +x 换成 u+x:
find /opt/scripts -name "*.sh" -type f -print0 | xargs -0 chmod u+x
这样组用户和其他人不会获得执行权限,适合生产环境。
避免常见坑点
以下写法容易出问题,尽量不用:
-
find . -name "*.sh" | xargs chmod +x—— 文件名带空格会断开,导致命令失败或误改其他文件; -
chmod +x $(find . -name "*.sh")—— 命令替换遇特殊字符直接报错,且可能触发“Argument list too long”错误; -
chmod -R +x *.sh——-R对文件无效,还可能递归进无关目录。
验证是否生效
执行完后快速检查几个脚本:
-
ls -l some_script.sh—— 权限列中出现 x(如-rwxr--r--)即成功; -
find . -name "*.sh" -type f -executable -print | head -3—— 列出前三个可执行的 .sh 文件,确认结果符合预期。











