You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用find查找含BOM的SQL文件时报paths must precede expression错误如何解决

问题排查与解决

核心错误原因

  • 普通字符串无法正确存储带特殊符号/通配符的多命令参数:你定义parametros="-type f -name "*.sql""时双引号嵌套失效,*.sql会被Shell在执行find命令前提前展开为当前目录下所有匹配的.sql文件名,就像你报错信息里出现的ComBOM.sql ComVirgula.sql SemBOM.sql被直接插入到了find参数中,直接破坏了find的语法结构。
  • 外层包裹的$(...)完全多余:会把find的输出结果(也就是匹配到的带BOM的文件路径)当成Shell命令再次执行,引发额外的未知错误。

修复方案

Bash中存储多命令参数的标准做法是使用数组,修复后完整脚本如下:

#!/bin/bash

set -x

printf '\nStart!\n'
caminho="$PWD"
# 用数组存储find参数,避免通配符提前展开和分词问题
parametros=(-type f -name '*.sql')

# 直接执行find命令,不要用$()包裹
find "${caminho}" "${parametros[@]}" -exec grep -l $'\xEF\xBB\xBF' {} \;

如果不需要单独存参数,也可以直接简化为更短的写法:

#!/bin/bash
printf '\nStart!\n'
find "$PWD" -type f -name '*.sql' -exec grep -l $'\xEF\xBB\xBF' {} \;

内容的提问来源于stack exchange,提问作者Pablo Sarturi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:24:04