如何将xargs -P命令的输出重定向到各自独立命名的文件
解决方案
你遇到的问题根源是:原写法中的mktemp会在整个管道命令启动前被当前shell提前求值,整个过程只会生成1个文件名,自然会出现并行进程输出覆盖的问题。你只需要把命令执行逻辑包裹在子shell中,让每次并行启动的进程独立执行mktemp即可:
场景1:直接重定向输出
find . -type f -print0 | xargs -0 -P 3 -I {} bash -c 'blahblahcommand "{}" > "$(mktemp).blah"'
场景2:需要通过-o参数指定输出文件
find . -type f -print0 | xargs -0 -P 3 -I {} bash -c 'blahblahcommand "{}" -o "$(mktemp).blah"'
可选优化
如果希望生成的临时文件有固定前缀方便后续整理,可以修改mktemp的模板,例如生成当前目录下前缀为task_output_的临时文件:
# 以重定向场景为例 find . -type f -print0 | xargs -0 -P 3 -I {} bash -c 'blahblahcommand "{}" > "$(mktemp ./task_output_XXXXXX).blah"'
其中XXXXXX是mktemp要求的随机字符占位符,会被自动替换为唯一字符串。
内容的提问来源于stack exchange,提问作者Mr.CPU
相关产品推荐
相关产品推荐

