dicom ファイルを NAS からダウンロード

dcm4chee の情報を ubuntu から取得して、その情報にしたがって dicom ファイルを NAS からローカルにダウンロードします。
以下のようなイメージです

ftp でダウンロード

本当は scp の方がいいのかもしれませんが、python の scp ではダウンロードにとても時間がかかったので ftp を使うことにしました。イントラネットですしセキュリティのことをあまり考えないで済むので。

ftp はヒアドキュメントを使うことが多いようですが、ヒアドキュメントでループを回す方法がわかりませんでした。
例えば以下のようなファイルリストがあるとして、


2021/11/12/12/823BFA57/823BFA59/81C090F6
2021/11/12/12/823BFA57/823BFA59/81C179B5
2021/11/12/12/823BFA57/823BFA59/81C1EE15
2021/11/12/12/823BFA57/823BFA59/81CBEE40
2021/11/12/12/823BFA57/823BFA59/81CC62A0
2021/11/12/12/823BFA57/823BFA59/81CCD700
2021/11/12/12/823BFA57/823BFA59/81CD4B60
2021/11/12/12/823BFA57/823BFA59/81CDBFC0
2021/11/12/12/823BFA57/823BFA59/81CE3420
2021/11/12/12/823BFA57/823BFA59/81CEA880
2021/11/12/12/823BFA57/823BFA59/E326D19D
2021/11/12/12/823BFA57/823BFA59/E326D19E
2021/11/12/12/823BFA57/823BFA59/E32727F6
2021/11/12/12/823BFA57/823BFA59/E32727F7
2021/11/12/12/823BFA57/823BFA59/E3272F7A
2021/11/12/12/823BFA57/823BFA59/E3272F7B
2021/11/12/12/823BFA57/823BFA59/E32736FE
2021/11/12/12/823BFA57/823BFA59/E32736FF
2021/11/12/12/823BFA57/823BFA59/E3273E82
2021/11/12/12/823BFA57/823BFA97/823BFA98

これらのファイルをローカルのあるディレクトリにダウンロードするには、一つ一つを cd を変えてダウンロードするしかないと思うのですが、ヒアドキュメントではできませんでした。

そこでダウンロード用のテキストファイルを作成してそれを読み込ませてダウンロードすることにしました。
こんな方法は全く知りませんでした。

ftp.sh

#!/bin/bash
touch flist.txt
truncate flist.txt --size 0

function ftptxt(){
    dn="cd /DCM/`dirname $1`"
    fn="get `basename $1`"
    echo $dn >> flist.txt
    echo $fn >> flist.txt
}
function filePath() {
    query="SELECT filepath FROM files WHERE instance_fk IN (SELECT pk FROM instance WHERE series_fk IN (SELECT pk FROM series WHERE study_fk = '83'));"
    result=$(mysql --defaults-extra-file=./database.conf -N -e "${query}")
    if [[ $? -eq 0 ]]; then
        for value in ${result}
            do
                echo "${value}"
                ftptxt "${value}"
            done
            else
        echo "fail to select from mysql." 1>&2
    fi
    echo "bye" >> flist.txt
}
filePath
cat ftpinfo.txt flist.txt > ftpdown.txt
ftp -p -n < ftpdown.txt

解説

最終的に作りたいのは以下のようなテキストファイルです。

ftpdown.txt

open 192.168.0.72
user username password
lcd /home/user/flask/dcmtemp

cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81C090F6
cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81C179B5
cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81C1EE15
cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81CBEE40
cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81CC62A0
cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81CCD700
cd /DCM/2021/11/12/12/823BFA57/823BFA59
........
bye

上から3行は、ftp 接続情報でこれは固定されています。
なので ftpinfo.txt として別に作成しておきます。

ftpinfo.txt

open 192.168.0.21
user username password
lcd /home/user/flask/dcmtemp

ftp ダウンロードは cd を変更してファイル名指定というパターンでいいようなのでそれを関数化します。


function ftptxt(){
    dn="cd /DCM/`dirname $1`"
    fn="get `basename $1`"
    echo $dn >> flist.txt
    echo $fn >> flist.txt
}

これにより、


cd /DCM/2021/11/12/12/823BFA57/823BFA59
get 81CBEE40

という文字列が flist.txt にどんどん書き込まれていきます。

すべてを書き終えたら、ftpinfo.txt と flist.txt を合体して ftpdown.txt を作成します。


cat ftpinfo.txt flist.txt > ftpdown.txt

そうして以下のようにすれば、dicom ファイルが NAS から /home/user/flask/dcmtemp フォルダにダウンロードされます。


ftp -p -n < ftpdown.txt