Shell脚本中find命令无法查找目录的问题求助
修复Shell脚本中目录复制失效的问题
问题根源分析
你的脚本存在几个关键错误,直接导致目录复制功能失效:
变量定义未闭合引号
这行代码末尾缺失了闭合双引号:HELM_PROJECT_BUILD_FOLDER="$HELM_BUILD_FOLDER/$PROJECT_NAME缺失引号会让后续所有依赖该变量的路径解析混乱,find命令自然找不到正确的目标位置。
find命令参数矛盾
第二个find命令的写法存在两处错误:-maxdepth 0表示只查找指定路径本身,但.helm/$PROJECT_NAME/*会被Shell展开成该目录下的所有子项,find不会处理这些展开后的内容,直接跳过。- 你要复制目录,但
-type f指定查找文件,类型完全不匹配,根本找不到目标。
终端直接运行的“奇怪现象”解释
当你在终端未定义$PROJECT_NAME时,Shell会把这个变量展开为空字符串,命令实际变成:find .helm/* -maxdepth 0 -type d -exec cp -R -av "{}" helm-build/my-project/ ";"此时是查找
.helm目录下的所有一级目录,所以能运行,但这和脚本里指定项目名的逻辑完全不符。
修复后的脚本
#!/bin/sh PROJECT_NAME=$1 HELM_BUILD_FOLDER="helm-build" # 修复:补上闭合双引号 HELM_PROJECT_BUILD_FOLDER="$HELM_BUILD_FOLDER/$PROJECT_NAME" # 复制.helm/$PROJECT_NAME下的所有文件到project-values(保留原正常逻辑) find ".helm/$PROJECT_NAME" -maxdepth 1 -type f -exec cp -av "{}" "$HELM_PROJECT_BUILD_FOLDER/project-values/" ";" # 复制.helm/$PROJECT_NAME下的所有一级目录到目标路径 # 修复1:路径改为".helm/$PROJECT_NAME",用-maxdepth 1查找子目录 # 修复2:-type d指定查找目录类型 # 修复3:cp添加-R参数递归复制目录 # 修复4:! -path 排除目录本身,只复制子目录 find ".helm/$PROJECT_NAME" -maxdepth 1 -type d ! -path ".helm/$PROJECT_NAME" -exec cp -Rav "{}" "$HELM_PROJECT_BUILD_FOLDER/" ";"
额外优化建议
- 所有路径变量引用时都加上双引号,避免路径包含空格或特殊字符时出错。
- 如果不需要精确过滤文件/目录类型,直接用
cp -Rav ".helm/$PROJECT_NAME"/* "$HELM_PROJECT_BUILD_FOLDER/"会比find更简洁。
内容的提问来源于stack exchange,提问作者Ben Zifkin
相关产品推荐
相关产品推荐

