手动和通过管道将参数传递给 GNU Parallel

手动和通过管道将参数传递给 GNU Parallel

为了做好准备,下面是一个示例文件结构:

test/1
test/2
test/3

我想做这个:

find -P -O3 "test/" -type f |
    parallel --use-cpus-instead-of-cores -j+0 --tmpdir "test/" --files ./test.bash

并传递另一个手动参数,test.bash如果是:

#!/usr/bin/env bash

main() {
  echo "yay $1 $2!"
}

main "$1" "$2"

的输出cat test/*.par是:

yay test/1 param!
yay test/2 param!
yay test/3 param!

我尝试过以下方法:

parallel --use-cpus-instead-of-cores -j+0 --tmpdir "test/" --files ./test.bash ::: 'param'
parallel --use-cpus-instead-of-cores -j+0 --tmpdir "test/" --files ./test.bash {} ::: 'param'

但它们都失败了,并且优先考虑手动参数而不是管道输入。

有办法执行此操作吗?

答案1

这有点不安全,因为文件名可以包含分隔符(换行符):

find -P -O3 test/ -type f \
| parallel -j+0 --use-cpus-instead-of-cores \
           --tmpdir test/ \
           --files \
           -m ./test.bash {} 'param'

使用:

find -P -O3 test/ -type f --print0 \
| parallel -0 \
           -j+0 --use-cpus-instead-of-cores \
           --tmpdir test/ \
           --files \
           -m ./test.bash {} 'param'

find通过 0 字节来生成单独的结果(这可以不是出现在文件名中),并使用parallel它们。

然而,为什么要使用find呢?使用zsh, 代替bash,

setopt extendedglob # usually already be on by default
setopt nullglob     # don't fail if no files found

parallel -j+0 --use-cpus-instead-of-cores \
         --tmpdir test/ \
         --files \
         -m ./test.bash {} 'param' \
   ::: test/**/*(.) 
###         ^^------- look recursively into all folders including the current
###                   (doesn't follow symlinks!)
###            ^----- for anything
###             ^^^-- as long as it's a file

答案2

终于找到了参考

find -P -O3 test/ -type f \
| parallel -j+0 --use-cpus-instead-of-cores \
           --tmpdir test/ \
           --files \
           -m ./test.bash {} 'param'

相关内容