如何在for循环与管道流程中修改文件扩展名?
解决方法
你可以通过以下几种方式在循环中处理扩展名转换,让commandB识别输入为.BBB格式的文件:
方法1:使用临时文件(最稳妥)
先将转换后的内容写入对应扩展名的临时文件,再传给commandB:
for file in *.AAA do # 替换文件名后缀为.BBB bbb_file="${file%.AAA}.BBB" # 执行转换并写入临时文件 commandA "$file" | awk '{ print }' > "$bbb_file" # 用commandB处理该临时文件 commandB -i "$bbb_file" # 清理临时文件 rm "$bbb_file" done
方法2:使用命名管道(避免磁盘写入,适合大文件)
用命名管道模拟.BBB文件,无需实际写入磁盘:
for file in *.AAA do bbb_file="${file%.AAA}.BBB" # 创建命名管道 mkfifo "$bbb_file" # 后台执行转换并写入管道 commandA "$file" | awk '{ print }' > "$bbb_file" & # 用commandB读取管道内容 commandB -i "$bbb_file" # 删除管道 rm "$bbb_file" done
方法3:符号链接指向标准输入(极简方案,视commandB兼容性而定)
创建指向/dev/stdin的.BBB符号链接,让commandB认为读取的是对应扩展名的文件:
for file in *.AAA do bbb_file="${file%.AAA}.BBB" ln -s /dev/stdin "$bbb_file" commandA "$file" | awk '{ print }' | commandB -i "$bbb_file" rm "$bbb_file" done
补充说明
${file%.AAA}.BBB是bash的字符串替换语法:%.AAA会去掉文件名末尾的.AAA后缀,再拼接.BBB得到目标文件名。- 如果
commandB支持直接从标准输入读取并无需指定扩展名(比如支持-i -参数),可以直接尝试:for file in *.AAA do commandA "$file" | awk '{ print }' | commandB -i - done
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

