디렉토리를 재귀적으로 찾아서 bash 스크립트에서 Python 스크립트 호출로 구문 분석하려면 어떻게 해야 합니까?

디렉토리를 재귀적으로 찾아서 bash 스크립트에서 Python 스크립트 호출로 구문 분석하려면 어떻게 해야 합니까?

단일 디렉터리 내의 여러 하위 디렉터리를 보고 python해당 스크립트 내에서 호출하는 스크립트를 사용하여 각 하위 디렉터리의 파일을 표시하려고 합니다.bashgnu-parallel

스크립트가 취하는 매개변수 는 :( 즉, 하위 디렉토리) 및 :( 제가 바라는 것과 동일 ) python입니다 . -ppath to files-ooutpath for plots-p

이 스크립트가 있습니다 bash.

#!/bin/bash

script="/path/to/python/script/plot.py"

files=($(find . -maxdepth 2 -mindepth 2 | sort))

pat=$files
out=$files
filt="True"
chan="Z"

parallel --jobs 4 python $script -f {} -p $pat -o $out -fl $filt -c $chan ::: ${files[@]}

그러나 각 하위 디렉토리에는 플롯이 없으며 스크립트가 매우 빠르게 실행되므로 또는 pat매개 out변수에 아무 것도 파이프되지 않는다고 가정합니다. 내가 뭘 잘못했나요? 감사해요!

답변1

나는 $pat와 $out가 당신이 생각하는 가치를 갖고 있지 않다고 생각합니다.

$ echo ${files[@]}
./d1/file1 ./d1/file2 ./d1/file3 ./d2/file4 ./d2/file5 ./d2/file6
$ pat=$files
$ echo ${pat[@]}
./d1/file1
$ out=$files
$ echo ${pat[@]}
./d1/file1

당신이 달성하고 싶은 것은 병렬의 내부 '변수' '{}'($files 배열의 각 멤버가 될 것임)의 값에 따라 $pat 및 $out에 대해 다른 값이 필요하다고 생각하지만 Place를 얻었습니다. 명령줄에 $files의 첫 번째 멤버만 표시됩니다.

GNU Parallel에서 지원하는 다른 "변수" 중 하나는 "{//}"이며, 이는 "{}" 값(있는 경우)이 있는 디렉터리 이름으로 대체됩니다.

이것을 감안할 때, 당신은 다음과 같은 것을 더 원한다고 생각합니다.

#!/bin/bash

script="/path/to/python/script/plot.py"

files=($(find . -maxdepth 2 -mindepth 2 | sort))

filt="True"
chan="Z"

parallel --jobs 4 python $script -f {} -p {//} -o {//} -fl $filt -c $chan ::: ${files[@]}

당신이 원하는 게 이게 더 있나요?

$ parallel echo python $script -f {} -p {//} -o {//} -f $filt -c $chan ::: ${files[@]}
python /path/to/python/script/plot.py -f ./d1/file1 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file2 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file3 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file5 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file4 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file6 -p ./d2 -o ./d2 -f True -c Z

조회 시 순서를 사용하고 있으므로 --keep-order 매개변수를 사용하는 것이 좋을 수도 있습니다.

$ parallel --keep-order echo python $script -f {} -p {//} -o {//} -f $filt -c $chan ::: ${files[@]}
python /path/to/python/script/plot.py -f ./d1/file1 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file2 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d1/file3 -p ./d1 -o ./d1 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file4 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file5 -p ./d2 -o ./d2 -f True -c Z
python /path/to/python/script/plot.py -f ./d2/file6 -p ./d2 -o ./d2 -f True -c Z

이것은 단지 보장합니다주문하다출력은 대신 입력과 동일합니다.일하다해당 순서 또는 결정적 순서로 실행합니다.

관련 정보