使用 find 将参数传递给并行程序

Use find to pass argument to program with parallel

我正在尝试将多个参数传递给一个程序。

find binaries/$package/lib -iname "*.txt" | parallel java -jar proguard/proguard.jar @obfuscateprofile -injars $package.jar -outjars binaries/$package/$pacakge.jar -libraryjars {}

我可以用echo做示范:

find binaries/derbypro/lib -iname "*.txt" | parallel echo -libraryjars {}

我希望程序为使用 find 找到的每个文件获取多个 -libraryjars 参数。例如,如果我有一个包含以下文件的目录:

file1.txt
file2.txt
file3.txt

而我 运行 命令,我希望它等同于 运行ning 程序,如下所示:

programname -libraryjars file1.txt -libraryjars file2.txt -libraryjars file3.txt

但我得到的是:

programname -libraryjars file1.txt
programname -libraryjars file2.txt
programname -libraryjars file3.txt

所以当我运行

find binaries/derbypro/lib -iname "*.txt" | parallel echo -libraryjars {}

我明白了

-libraryjars file1.txt
-libraryjars file2.txt
-libraryjars file3.txt

所以它正在执行多个 echo 程序。如果我用 -N 3 指定我期望的参数数量,它工作正常,但我不知道 fine 会找到多少文件。

parallel 遵循 map-reduce 范式。它旨在将大任务分成小任务并将它们分配给多个程序,这不能满足您的要求。

例如,使用并行的简单 map-reduce wc 程序将是:

cat XXX | parallel --block 10M --pipe wc -l | awk 'BEGIN{count=0;}{count = count+ ;} END{print count;}'

请检查:了解更多详情。

在你的情况下,你想要的是programname -libraryjars file1.txt -libraryjars file2.txt -libraryjars file3.txt

您可以像这样连接您的参数:

find binaries/derbypro/lib -iname "*.txt" | awk '{params = params " " "-libraryjars " ;} END {print params;}' | xargs programname

到运行你的程序

试试这个:

programname -libraryjars `find binaries/$package/lib -name '*.txt' | xargs | sed 's/ / -libraryjars /g'`

我认为 .txt 文件的数量并不多。

你可能会使用 bash 函数来修饰带有 -libraryjars 前缀的 find 的任何结果行:

find binaries/$package/lib -iname "*.txt" |  { while read LINE; do echo "-libraryjars $LINE"; done;} | xargs java -jar proguard/proguard.jar @obfuscateprofile -injars $package.jar -outjars binaries/$package/$package.jar

限制是它可能会被包含空格或非正统字符(被视为 xargs 的分隔符)的文件所欺骗。