如何在Bash中合并不同子目录下的同名in.BV文本文件?
解决合并子目录中in.BV文件的问题
嘿,我来帮你排查下脚本的问题~你的思路是对的,但脚本里有个小语法错误导致完全没执行到cat命令,所以生成的文件是空的。
问题出在哪?
你原来的脚本:
for d in */ do (cd $d cat *in.BV >> Newin.txt) done
这里的关键问题是cd $d和cat之间没有分隔符(分号或者换行),Bash会把cd $d cat当成一个完整的命令去执行——显然不存在叫cd的命令还带$d cat参数,所以整个循环里的命令都执行失败,自然没有内容写入Newin.txt。
另外还有两个小细节需要优化:
*in.BV其实没必要用通配符,你明确要找的是in.BV,直接写文件名更准确;$d没有用引号包裹,如果子目录名里有空格,脚本会报错;- 你用
(...)开启了子shell,cd进去后,>> Newin.txt会在子目录里创建文件,而不是你期望的主目录里。
修正后的方案
这里给你两个简单好用的方案:
方案1:不切换目录,直接引用文件路径(推荐)
这个方法更直观,不用切换目录,直接遍历每个子目录下的in.BV并追加到主目录的文件里:
# 先清空目标文件(如果之前存在的话) > Newin.txt # 遍历所有子目录 for d in */; do cat "$d/in.BV" >> Newin.txt done
方案2:切换目录执行(适合需要在子目录做更多操作的场景)
如果一定要切换到子目录执行,记得加分隔符和返回上级目录的路径:
> Newin.txt for d in */; do # 用&&确保cd成功后再执行cat,避免报错 (cd "$d" && cat in.BV >> ../Newin.txt) done
进阶:处理可能的异常情况
如果担心有些子目录里没有in.BV文件,可以加个判断,避免报错还能给出提示:
> Newin.txt for d in */; do target_file="$d/in.BV" if [ -f "$target_file" ]; then cat "$target_file" >> Newin.txt else echo "⚠️ 警告:$target_file 不存在,已跳过" >&2 fi done
内容的提问来源于stack exchange,提问作者Richie Howard
相关产品推荐
相关产品推荐

