我想在 Linux 系统上使用 bash 和 xargs 并行运行 N 次命令。命令如下:
for i in `seq 1 $(howmany.txt)`; do aprogramm --file file$i.dat ; done
该文件howmany.txt
包含值100
,并且ntimes.txt
包含值5
。
文件按顺序从 1 到 100file1
存在file100
,我想一次并行处理 5 个文件。如何使用 执行此操作xargs
?
我想在 Linux 系统上使用 bash 和 xargs 并行运行 N 次命令。命令如下:
for i in `seq 1 $(howmany.txt)`; do aprogramm --file file$i.dat ; done
该文件howmany.txt
包含值100
,并且ntimes.txt
包含值5
。
文件按顺序从 1 到 100file1
存在file100
,我想一次并行处理 5 个文件。如何使用 执行此操作xargs
?
您展示的内容存在很多问题。首先,
$(howmany.txt)
将尝试执行howmany.txt
。如果这是一个可执行脚本,存储在您的 PATH 中,它会打印出一个数字,那么它可能会起作用,但如果它只是一个带有数字的文本文件,您可能想要$(cat howmany.txt)
。其次,最好使用$( command )
而不是`seq`
命令(更清晰且允许嵌套命令)。也就是说,要做到这一点
xargs
,你需要类似的东西:但实际上,这是GNU parallel的工作:
或者,如果您的所有文件都已命名
fileN
,并且您想要处理所有文件fileN
(因此您实际上不需要howmany.txt
),那么您可以执行以下操作:parallel
它具有众多优点,其中之一xargs
就是您可以在运行时更改数量howmany.txt
,从而增加或减少正在运行的作业数量。不要编写脚本来执行命令,而是编写一个回显命令的脚本:
无论您使用哪个 shell,该输出的每一行都应该是有效的命令语法。
一旦输出看起来不错,就将其通过管道传输到parallel(1),并选择
-j5
并行运行 5 个作业:要批量处理文件,请使用
xargs -n
。如果每批处理一个文件,请使用 1:要并行处理,请使用
-P
。假设:
howmany.txt
,并ntimes.txt
保证包含一个整数,不包含任何其他内容find . -name 'file*.dat'
可能会返回比所需更多的文件)为了演示目的:
一个想法是使用 Jim 的方法来打印通过管道传输到 xargs 的文件名列表:
这将生成:
我最近必须在不使用 xargs/parallel 的情况下解决这个问题……