エコー出力リストを.txtとして保存

エコー出力リストを.txtとして保存

職場では、エコー出力の長いリストをデスクトップに.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コマンドを実行します。これについてもっと読むことができます。dcmdumpline''ここ

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)に印刷されます。

関連情報