職場では、エコー出力の長いリストをデスクトップに.txtファイルとして保存するのに多くの困難があります。私はヨセミテ10.10.4でBashを使用しています。私は初めてBashに触れたので、助けとヒントをいただきありがとうございます。
目的は、各脳スキャンに使用されるプロトコル名を印刷して、長い脳スキャンリストを取得することです。私はforループを使用して各脳スキャンを再帰的に進め、使用されたプロトコルを抽出し、その情報を取得するために使用された正確なファイルのパスで再エコーしました。
私のスクリプト:
for i in /Path/to/scans/
do
for file in "$i/"001*/0001.dcm
do
# If there is no such file here, just skip this scan.
if [ ! -f "$file" ]
then
echo "Skipping $i, no 0001.dcm file here" >&2
continue
fi
# Otherwise take the protocol data from scan out
line= dcmdump +P 0040,0254 0001.dcm
## dcmdump is the command line tool needed to pull out this data.
## In my case I am saving to variable "line" the protocol used in
## the scan that this single 0001.dcm file belongs to (scans require
## many .dcm files but each one contains this kind of meta-data).
# Print the result
echo "$line $file"
break
done
done
したがって、このスクリプトはほとんど機能します。 [マイターミナル]ウィンドウには、使用されているプロトコルの長いリストと、各スキャンに使用された0001.dcmファイルの絶対ファイルパスが表示されます。
私の問題は、私がそれを変えるとき
echo "$line $file" >> /Users/me/Desktop/scanparametersoutput.txt
私のデスクトップに表示されるテキストファイルは空です。私が間違っていることを知っている人はいますか?
答え1
スクリプトで発生した問題の1つは、次のようになります。
line= dcmdump +P 0040,0254 0001.dcm
dcmdump
出力を代入する代わりに、set to という環境変数を使用してline
コマンドを実行します。これについてもっと読むことができます。dcmdump
line
''
ここ。
dcmdump
したがって、実際に見ているのは何も割り当てられていない$line
ための出力ではなく、実行中のスクリプトの出力です。$line
プログラムの出力をキャプチャするには、次の構文を使用します。
line=$(dcmdump +P 0040,0254 0001.dcm)
=
(また、セキュリティ上の理由から、ロゴの前後にスペースはありません。)
$()
サブシェルの角かっこ内のコードを実行し、コード出力に「代替」します。
0001.dcm
これをコマンドでもdcmdump
使いたいかもしれませんが$file
、私はそれに慣れていないので皆さんにお任せします。
答え2
rmelcerが述べたように、line
変数が設定されておらず、dcmdump
正しいファイルで実行されていないようです。
line=$(dcmdump +P 0040,0254 "$file")
スクリプトの設定と構造は、必要以上に少し複雑に見えます。
外部path
ループは繰り返されませんが、おそらくこれは単なる例です。
0001.dcmというディレクトリがないと、ファイルテストが失敗する可能性はありません(ループ0001.dcm
で具体的に探していますfor
)。
for path in /Path/to/scans/; do
for file in "$path/"001*/0001.dcm; do
# If there is no such file here, just skip this scan.
if [ ! -f "$file" ]; then
echo "Skipping $file, no 0001.dcm file here" >&2
continue
fi
# Otherwise take the protocol data from scan out
line=$(dcmdump +P 0040,0254 "$file")
# Print the result
echo "$line $file"
done
done
出力に最初に表示されるファイル名を処理できる場合は、次を使用する方が簡単ですfind
。
find /Path/to/scans/001* \
-name 0001.dcm \
-type f \
-printf "%p " -exec dcmdump +P 0040,0254 {} + \
| tee /Users/me/Desktop/scanparametersoutput.txt
次に、0001.dcm()というファイル()を見つけて/Path/to/scans/001*
そのファイル()のフルパスを印刷し、そのファイル()に対してdcmdumpコマンドを実行します。-type f
-name 0001.dcm
-printf "%p "
-exec xxx {} +
その後、findコマンドの出力がtee
画面にパイプされ、指定されたファイル(/Users/me/Desktop/scanparametersoutput.txt
)に印刷されます。