Bash 逐行读取文件并运行java程序

Bash 逐行读取文件并运行java程序,bash,loops,while-loop,Bash,Loops,While Loop,我需要运行一个java程序,用扩展名*bam合并多个文件。该计划的结构如下: java -jar mergefiles.jar \ I=file1.bam \ I=file2.bam \ I=file3.bam \ O=output.bam 因此,我正在尝试对目录中的所有*bam文件运行此程序。最初,我尝试创建一个包含*bam文件名的列表(filenames.txt) 使用“while”命令,如: while read -r line; do java -jar MergeFiles.jar

我需要运行一个java程序,用扩展名
*bam
合并多个文件。该计划的结构如下:

java -jar mergefiles.jar \
I=file1.bam \
I=file2.bam \
I=file3.bam \
O=output.bam
因此,我正在尝试对目录中的所有*bam文件运行此程序。最初,我尝试创建一个包含*bam文件名的列表(filenames.txt)

使用“while”命令,如:

while read -r line; do
java -jar MergeFiles.jar \
I=$line \
O=output.bam
done < filenames.txt
读取-r行时
;做
java-jarmergefiles.jar\
I=$line\
O=输出.bam
完成
但是,为文本文件中的每个
*bam
文件执行的程序不是全部执行的(每次仅合并一个文件,并覆盖输出)。那么,如何运行该程序以递归方式合并所有
*bam
文件呢

此外,bash中还有其他选项(例如使用循环for)来解决此问题


提前感谢。

在您的问题中,您指定要使用dir中的所有
.bam
文件,因此您可能应该使用dir来代替使用文件名创建文件。下面是一个例子:

#! /bin/bash
# set nullglob to be safe
shopt -s nullglob
# read the filenames into an array
files=( *.bam )
# check that files actually exist
if (( ${#files[@]} == 0 )); then echo "no files" && exit 1; fi
# expand the array with a replacement
java -jar MergeFiles.jar \
"${files[@]/#/I=}" \
O=output.bam

当前解决方案的问题是
while
循环一次只读取一行,分别在每行调用命令。

您应该使用
xargs
并行
。看看吧,它应该可以满足你的需要。谢谢你的帮助,@olli-k!工作完美!
#! /bin/bash
# set nullglob to be safe
shopt -s nullglob
# read the filenames into an array
files=( *.bam )
# check that files actually exist
if (( ${#files[@]} == 0 )); then echo "no files" && exit 1; fi
# expand the array with a replacement
java -jar MergeFiles.jar \
"${files[@]/#/I=}" \
O=output.bam