단일 디렉터리 내의 여러 하위 디렉터리를 보고 python
해당 스크립트 내에서 호출하는 스크립트를 사용하여 각 하위 디렉터리의 파일을 표시하려고 합니다.bash
gnu-parallel
스크립트가 취하는 매개변수 는 :( 즉, 하위 디렉토리) 및 :( 제가 바라는 것과 동일 ) python
입니다 . -p
path to files
-o
outpath 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
이것은 단지 보장합니다주문하다출력은 대신 입력과 동일합니다.일하다해당 순서 또는 결정적 순서로 실행합니다.