에코 출력 목록을 .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

스크립트에 발생한 한 가지 문제는 다음 줄입니다.

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) 에 인쇄됩니다.

관련 정보