循环创建子目录并移动匹配文件脚本报错:找不到指定文件求助
问题分析与修复方案
你的脚本出现文件不存在的错误,主要是几个细节处理不当导致的,我来一步步拆解问题并给出修复后的版本:
原脚本的核心问题
- 命令分隔缺失:
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
相关产品推荐
相关产品推荐

