使用 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 的分隔符)的文件所欺骗。
我正在尝试将多个参数传递给一个程序。
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 的分隔符)的文件所欺骗。