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

Bash脚本如何从指定子目录可靠查找.txt文件?

稳健的Bash脚本:匹配指定子目录下的.txt文件并复制

问题分析

你的原脚本存在两个核心问题:

  1. 变量赋值语法错误:basename= "${i}" 中等号后多余的空格会导致Bash解析失败,正确写法应为basename="${i}"
  2. 依赖Shell通配符的find命令兼容性差:find ./controllers/*/files/*txt 依赖Shell先展开通配符,若controllers下存在无files子目录的项,Shell会将未匹配的通配符原样传递给find,触发"No such file or directory"错误(GitHub Actions环境可能存在这类未匹配场景,而本地环境恰好所有子目录都包含files)

解决方案

方法1:用find的-path参数精确匹配路径(推荐)

让find自行遍历并匹配路径,避免Shell通配符的不确定性,同时修正原脚本的其他细节问题:

# 确保目标目录存在,防止cp因目录不存在报错
mkdir -p ./dest

# 遍历controllers下所有路径包含"/files/"的.txt文件
for file in $(find ./controllers -type f -path "*/files/*.txt"); do
    cp "$file" ./dest/
done

方法2:用find的-exec直接处理(更高效)

如果不需要在循环中执行额外逻辑,直接用find的-exec参数可以省去Shell循环,更简洁高效:

mkdir -p ./dest
find ./controllers -type f -path "*/files/*.txt" -exec cp {} ./dest/ \;

关键细节说明

  • -type f:确保仅匹配文件,排除同名目录(虽然.txt通常是文件,但加上该参数更严谨)
  • -path "*/files/*.txt":匹配所有路径中包含/files/且以.txt结尾的文件,无论controllers下新增多少子目录(如a、b、c),都能精准定位到对应files目录下的目标文件
  • mkdir -p ./dest:-p参数会自动创建不存在的父目录,确保目标目录始终可用
  • 变量加双引号:"$file" 可处理文件名包含空格、特殊字符的情况,是Bash脚本的核心最佳实践

原命令在GitHub Actions报错的原因

本地运行正常是因为你的环境中controllers下的所有子目录都包含files文件夹,Shell能正常展开./controllers/*/files通配符;而GitHub Actions环境中可能存在某个子目录没有files,Shell无法展开通配符,会将./controllers/*/files当作字面路径传递给find,导致find找不到该路径而报错。用find的-path参数则完全由find自行处理路径匹配,不受Shell环境差异影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:10:56