수동으로 또는 파이프를 통해 매개변수를 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'

find0바이트로 개별 결과를 생성합니다.아니요파일 이름에 표시됨) 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'

관련 정보