직장에서 에코 출력의 긴 목록을 데스크탑에 .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
명령을 실행합니다. 이에 대해 더 자세히 읽을 수 있습니다.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
) 에 인쇄됩니다.