GNU 병렬 방식으로 인수를 전달하는 동안 변수를 입력으로 사용하고 싶습니다. 예를 들어, 세 개의 bash 스크립트가 있고 GNU Parallel을 사용하여 병렬로 실행하고 싶습니다.
"par1.sh", "par2.sh", "par3.sh". 내 스크립트는 다음과 같습니다
Filecount=$(grep -c "if" $1)
echo $Filecount
parallel -j0 sh ::: par$(seq 1 $Filecount).sh
mkdir $2
mv par$(seq 1 $Filecount).sh ./$2
이 코드를 실행하기 위해 가능한 모든 것을 시도했지만 작동하지 않습니다. 그래서 제 질문은 GNU 병렬 처리에 변수를 제공하는 방법입니다. 나는 또한 이것을 시도했습니다 :
par{1..$Filecount}.sh
하지만 그것도 작동하지 않습니다. "seq"도 시도했습니다.
답변1
문제는 병렬성이 아니라 전달하는 "변수"에 있습니다. 이는 par$(seq 1 $Filecount).sh
(가설적으로) 다음과 같이 확장됩니다 Filecount=10
.
$ echo par$(seq 1 $Filecount).sh
par1 2 3 4 5 6 7 8 9 10.sh
중괄호 확장처럼 작동하기를 원합니다.
$ echo par{1..10}.sh
par1.sh par2.sh par3.sh par4.sh par5.sh par6.sh par7.sh par8.sh par9.sh par10.sh
그러나 변수는 중괄호 확장 내에서 확장되지 않습니다.
$ echo par{1..$Filecount}.sh
par{1..10}.sh
좋은 소식은 이 중 어느 것도 실제로 필요하지 않다는 것입니다. 다음 중 하나를 수행할 수 있습니다.
일반 글로브 사용
parallel -j0 sh ::: par*sh
아마도
parallel -j0 sh ::: par[0-9]*.sh
사전 빌드 변수
targets=""; for ((num=1;num<=$Filecount;num++)); do targets="$targets par$num.sh"; done parallel -j0 sh ::: $targets
따라서 두 번째 접근 방식을 사용하면 스크립트는 다음과 같습니다(임의의 파일 이름에 대해 안전하도록 약간 수정되었으며 귀하의 경우에는 관련이 없지만 향후 방문자에게는 적합할 수 있음).
Filecount=$(grep -c "if" "$1")
echo "$Filecount"
targets=( "par1.sh" );
for ((num=2;num<=$Filecount;num++)); do
targets=("${targets[@]}" par"$num".sh);
done
parallel -j0 sh ::: "${targets[@]}"
mkdir "$2"
mv "${targets[@]}" ./"$2"
답변2
mkdir $2
seq $Filecount | parallel -j0 sh par{}.sh';' mv par{}.sh ./$2