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

shell批量替换文件内容时如何排除指定文件夹?

问题解决方法

问题原因

  • 变量未正确展开:你编写的排除路径中$outputfolder在单引号作用域内,shell不会将其解析为你定义的deploymentFolder变量值,导致排除规则无法匹配到真实的staticresources路径,所以过滤失效。
  • 排除规则逻辑不完善:原规则*.*仅能匹配带后缀名的文件,且是逐个匹配目录内文件,效率低也容易有遗漏。

修正方案

方案1:排除指定目录

推荐使用-prune参数直接跳过整个staticresources目录,同时修正变量引用的引号规则,修改后的脚本如下:

outputfolder="deploymentFolder"

echo "<---INFO Convert Source to Metadata Format--->"
sfdx force:source:convert --rootdir ../force-app-core/main/default -d ../$outputfolder

echo "<---INFO Replace with empty string in the converted source--->"
# 修正后的find命令,直接排除整个staticresources目录
find ../$outputfolder -path "../$outputfolder/staticresources" -prune -o -type f -print0 | \
while IFS= read -r -d '' d;
do
    echo "$d"
    # 注意:如果是Mac系统,sed命令要改为 sed -i '' "s/sp_core__//g" "$d"
    sed -i "s/sp_core__//g" "$d"
done
echo "<---INFO Replace with empty string is Completed--->"

命令说明

  • -path "../$outputfolder/staticresources" -prune:匹配到staticresources目录时直接跳过该目录下的所有内容,不需要逐个匹配内部文件,效率更高
  • -o 是逻辑或的意思,意思是如果没有匹配到被排除的目录,就执行后面的-type f -print0逻辑,输出所有普通文件

方案2:仅搜索指定目录(更简单)

如果你确定后续也只需要处理classes和objects两个目录下的文件,不需要处理其他目录,也可以直接指定搜索路径,完全不需要写排除规则,代码更简洁不易出错:

outputfolder="deploymentFolder"

echo "<---INFO Convert Source to Metadata Format--->"
sfdx force:source:convert --rootdir ../force-app-core/main/default -d ../$outputfolder

echo "<---INFO Replace with empty string in the converted source--->"
# 直接指定只搜索classes和objects两个目录
find ../$outputfolder/classes ../$outputfolder/objects -type f -print0 | \
while IFS= read -r -d '' d;
do
    echo "$d"
    # Mac系统改为 sed -i '' "s/sp_core__//g" "$d"
    sed -i "s/sp_core__//g" "$d"
done
echo "<---INFO Replace with empty string is Completed--->"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:18:01