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

Shell脚本遍历目录无法筛选xcworkspace/xcodeproj问题求助

解决Shell递归遍历中同时排除xcworkspace和xcodeproj目录的问题

问题根源

原脚本核心条件存在逻辑错误:判断是否递归目录时误用了||(逻辑或),而非&&(逻辑与)。

要实现跳过后缀为xcworkspace或xcodeproj的目录,递归条件应该是:当前是目录,并且后缀既不是xcodeproj,也不是xcworkspace。原条件"${name##*.}" != ${projectFile} || "${name##*.}" != ${workspaceFile}永远为真——因为一个目录的后缀不可能同时等于两个不同值,无论目录类型是什么,这个条件都会成立,导致脚本无法跳过目标排除目录,最终无法正确收集文件。

修正后的核心代码

if [[ -d "$name" && ("${name##*.}" != ${projectFile} && "${name##*.}" != ${workspaceFile}) ]]; then
    path=$name
    walk_dir "$name"
else 
    if [ "${name##*.}"x = ${workspaceFile}x ] || [ "${name##*.}"x = ${projectFile}x ];then
        fileList+=($name)
    fi
fi

额外优化建议

  1. 统一语法简化文件判断逻辑,去掉冗余的x拼接兼容写法:
if [[ "${name##*.}" == "$workspaceFile" || "${name##*.}" == "$projectFile" ]]; then
    fileList+=("$name")
fi
  1. 用find命令替代手动递归,更简洁可靠:
# 自动排除指定后缀目录,直接收集目标文件
fileList=($(find . -type d \( -name "*.xcworkspace" -o -name "*.xcodeproj" \) -prune -o \( -name "*.xcworkspace" -o -name "*.xcodeproj" \) -type f -print))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:15:19