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
额外优化建议
- 统一语法简化文件判断逻辑,去掉冗余的
x拼接兼容写法:
if [[ "${name##*.}" == "$workspaceFile" || "${name##*.}" == "$projectFile" ]]; then fileList+=("$name") fi
- 用
find命令替代手动递归,更简洁可靠:
# 自动排除指定后缀目录,直接收集目标文件 fileList=($(find . -type d \( -name "*.xcworkspace" -o -name "*.xcodeproj" \) -prune -o \( -name "*.xcworkspace" -o -name "*.xcodeproj" \) -type f -print))
内容的提问来源于stack exchange,提问作者x_z
相关产品推荐
相关产品推荐

