手動またはパイプを介してパラメータを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ゼロバイトで個々の結果を生成します。いいえファイル名に表示されます)parallelを使用してください。

しかし、なぜ使用するのですかfindzsh代わりに、を使用してください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

おすすめ記事