如何让parallel模仿xargs行为仅生成--joblog输出?
让GNU Parallel与xargs行为一致的方法
要让Parallel像xargs那样一次性把所有输入参数传给目标命令(而非逐个参数执行),同时满足生成joblog、单进程执行的需求,只需用以下关键选项组合:
核心解决方案
使用--xargs选项直接模拟xargs的参数打包行为,配合-j 1强制单进程(禁用并行),加上--joblog指定日志文件。
示例对比
假设原xargs命令是:
# xargs版本:一次性将所有.txt文件传给tar find . -name "*.txt" | xargs tar cf archive.tar
替换为Parallel的等价命令:
# Parallel版本:和xargs行为完全一致,同时生成joblog find . -name "*.txt" | parallel --xargs -j 1 --joblog tar_job.log tar cf archive.tar
为什么默认Parallel会报错?
Parallel默认行为是逐个处理输入的每一行/每个参数,比如输入有file1.txt、file2.txt,它会执行两次tar命令:
tar cf archive.tar file1.txt tar cf archive.tar file2.txt
这会导致第二次执行时覆盖归档文件或触发错误,而xargs是把所有参数合并成一组传给tar,只执行一次。
处理带特殊字符的参数
如果你的文件名包含空格、引号等特殊字符,原xargs用-0的话,Parallel要对应加上--null:
find . -name "*.txt" -print0 | parallel --null --xargs -j 1 --joblog tar_job.log tar cf archive.tar
替代方案:用-N指定超大参数组
如果不想用--xargs,可以用-N设置一个足够大的数字(确保能容纳所有输入参数),同样实现单组参数传递:
find . -name "*.txt" | parallel -N 10000 -j 1 --joblog tar_job.log tar cf archive.tar
内容的提问来源于stack exchange,提问作者James Rowell
相关产品推荐
相关产品推荐

