如何用Bash脚本遍历源文件夹并将输出写入指定目标文件夹
问题:Bash脚本批量处理文件时生成对应命名的输出文件
我编写了一个Bash脚本,期望遍历source-folder目录,对其中所有文件运行myProgram程序,并将输出写入另一个dest-folder目录,且输出文件需使用略有不同的命名。
myProgram需接收5个参数,示例:
./myProgram PAR1 infile1.txt PAR3 PAR4 infile_run1.txt
source-folder包含文件:
- infile1.txt
- infile2.txt
- infile3.txt
dest-folder需生成对应输出文件:
- infile_run1.txt
- infile_run2.txt
- infile_run3.txt
我已实现遍历文件夹并运行程序,但无法为每个输入文件生成对应输出文件,当前代码仅生成一个名为NewName的文件:
#!/bin/bash for filename in ~/path/to/source-folder/*; do echo $filename ./myProgram -A $filename -B -C ~/path/to/dest-folder/Newname done
请问如何实现为每个源文件夹的输入文件在目标文件夹生成对应输出文件?
解决方案
核心是根据输入文件名动态生成对应的输出文件名,通过Bash的字符串处理功能即可实现,修改后的脚本如下:
#!/bin/bash # 提前定义目录路径,便于后续维护修改 SOURCE_DIR=~/path/to/source-folder DEST_DIR=~/path/to/dest-folder for filepath in "$SOURCE_DIR"/*; do # 跳过目录,只处理文件 [[ -f "$filepath" ]] || continue # 从完整路径中提取纯文件名(去掉路径部分) filename=$(basename "$filepath") # 按规则替换生成输出文件名:将infileN.txt转为infile_runN.txt output_filename=${filename/infile/infile_run} # 拼接目标文件的完整路径 output_path="$DEST_DIR/$output_filename" # 执行程序,用双引号包裹变量避免空格等特殊字符导致的参数错误 echo "处理文件:$filepath -> $output_path" ./myProgram -A "$filepath" -B -C "$output_path" done
关键细节说明:
- 路径与变量的引号包裹:用双引号包裹目录、文件路径变量,避免遇到含空格的目录/文件名时出现参数拆分错误。
- 过滤非文件对象:
[[ -f "$filepath" ]] || continue确保只处理文件,跳过目录等非文件对象。 - 字符串替换逻辑:
${filename/infile/infile_run}是Bash内置的字符串替换语法,将文件名中第一个匹配的infile替换为infile_run,完美匹配你的命名需求。 - 通用命名适配:如果输入文件名模式更灵活(比如
data_001.txt要生成data_001_run.txt),可以改用后缀替换逻辑:# 先去掉.txt后缀,再拼接_run.txt output_filename=${filename%.txt}_run.txt
内容的提问来源于stack exchange,提问作者user3443063
相关产品推荐
相关产品推荐

