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
相关产品推荐
相关产品推荐

