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

循环创建子目录并移动匹配文件脚本报错:找不到指定文件求助

问题分析与修复方案

你的脚本出现文件不存在的错误,主要是几个细节处理不当导致的,我来一步步拆解问题并给出修复后的版本:

原脚本的核心问题

  • 命令分隔缺失:mkdir "$dir/Summary_CSV" 和 mv 命令之间没有用分号(;)或者换行分隔,shell会把它们当成一个命令执行,导致语法逻辑混乱
  • 通配符被引号屏蔽:你给*SUMMARY-ABC.csv加了双引号,这会让shell把星号当成普通字符,而不是通配符去匹配文件,所以它会尝试寻找字面名为*SUMMARY-ABC.csv的文件,自然找不到
  • 不安全的目录列表方式:用$(ls -d */)获取目录列表在某些特殊场景(比如目录名含空格或特殊字符)下会出错,更稳妥的方式是直接用shell glob
  • 路径冗余斜杠:$dir本身已经是带斜杠的目录名(比如SUBDIR1/),拼接后会出现SUBDIR1//Summary_CSV这种冗余斜杠,虽然shell能处理,但容易引发混淆

修复后的脚本

for dir in */; do
    # 先确保目标子目录存在(-p参数避免重复创建报错)
    mkdir -p "${dir}Summary_CSV"
    # 移动当前子目录下匹配的CSV文件到目标子目录
    mv "${dir}"*SUMMARY-ABC.csv "${dir}Summary_CSV/"
done

关键优化点说明

  • 直接用*/作为循环对象,shell会自动展开所有子目录,避免ls带来的潜在问题
  • mkdir -p参数可以避免当子目录已经存在时抛出错误,让脚本更健壮
  • 移除*SUMMARY-ABC.csv的引号,让shell正常展开通配符,匹配所有符合命名规则的文件
  • 用${dir}明确拼接路径,确保文件路径正确指向每个子目录下的目标文件

如果你的CSV文件是在当前工作目录下(而非每个子目录内),脚本可以调整为:

for dir in */; do
    mkdir -p "${dir}Summary_CSV"
    mv *SUMMARY-ABC.csv "${dir}Summary_CSV/"
done

不过根据你报错里的路径SUBDIR1///*SUMMARY-ABC.csv,推测文件是在每个子目录下,所以第一个脚本更符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:30:10