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

Shell脚本中find命令无法查找目录的问题求助

修复Shell脚本中目录复制失效的问题

问题根源分析

你的脚本存在几个关键错误,直接导致目录复制功能失效:

  1. 变量定义未闭合引号
    这行代码末尾缺失了闭合双引号:

    HELM_PROJECT_BUILD_FOLDER="$HELM_BUILD_FOLDER/$PROJECT_NAME
    

    缺失引号会让后续所有依赖该变量的路径解析混乱,find命令自然找不到正确的目标位置。

  2. find命令参数矛盾
    第二个find命令的写法存在两处错误:

    • -maxdepth 0表示只查找指定路径本身,但.helm/$PROJECT_NAME/*会被Shell展开成该目录下的所有子项,find不会处理这些展开后的内容,直接跳过。
    • 你要复制目录,但-type f指定查找文件,类型完全不匹配,根本找不到目标。
  3. 终端直接运行的“奇怪现象”解释
    当你在终端未定义$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:25:21