여러 파일에 대해 스크립트를 반복하는 방법은 무엇입니까?

여러 파일에 대해 스크립트를 반복하는 방법은 무엇입니까?

Gnuplot 스크립트가 있습니다(EXE), 이 스크립트에서 제가 제공한X_001일부 함수에 의해 그려진 입력 파일로 출력 파일을 제공합니다.X_001.png. 입력 및 출력 파일의 이름을 수동으로 입력하면 제대로 작동합니다. 파일에 대해 이 스크립트를 반복하려고 합니다.{X_001..X_300} 나는 이 루프를 썼다.

for i in X_*; do sed -i 's/X_*/${i}/g' exe ; ./exe ; done

하지만 이건 도움이 안 돼

여기서 상황이 변합니다exe스크립트를 작성해야 함

set term png size 1600,1200
set output "X_001.png"
splot 'X_001'

답변1

나는 Bash 스크립트를 사용하는 것을 선호 하며 gnuplot. 파일을 데이터로 사용해 보세요. 따라서 데이터 파일이 이고 다음과 같이 플롯하려고 한다고 가정 해 보겠습니다 .X_*X_*.pngX_*.outX_*.png

#!/bin/bash
export LANG=C LC_ALL=C

for data in X_*.out ; do
    [ -r "$data" ] || continue
    png="${data%.*}.png"

    gnuplot <<END-OF-PLOT

        set term png enhanced size 1024,512
        set output "$png"

        set title "$data"
        plot "$data" u 1:2 notitle w lines

END-OF-PLOT
done

export LANG=C LC_ALL=C줄은 기본 C/POSIX 로케일을 설정합니다. 다른 사람(예: 강사/교사/TA)이 동일한 스크립트를 실행하지만 우연히 다른 언어를 사용하는 경우(그리고 귀하와 다른 로케일을 선호하는 경우) 여전히 동일한 플롯을 재생성합니다.

(문제는 어떤 로케일은 .소수점으로 사용하고 어떤 로케일 은 ,..

glob 패턴과 일치하는 파일이 없으면 X_*.out기본적으로 Bash는 루프 본문을 한 번 반복하고 dataX_*.out자체를 갖습니다. 이 [ -r "$data" ] || continue테스트는 지정된 읽기 가능한 파일이 변수에 존재하는지 확인합니다 data. 그렇지 않은 경우 다음 반복으로 점프합니다(나머지 루프 본문은 이 값에 대해 실행되지 않습니다).

png할당에 유의하세요 . ${data%.*}결과는 변수 값 data(여기서는 데이터 파일 이름)이지만 끝부터 모든 것이 .삭제됩니다. ( .안에 없으면 data아무것도 삭제되지 않습니다.)

따라서 Bash에서 ${data%.*}.png결과는 의 값이지만 data파일 이름 접미사가 있으면 으로 대체됩니다 .png. 파일 이름 접미사가 없으면 .png추가됩니다.

<<END-MARKER시작하는 데 사용여기 문서배쉬에서. 다음으로 시작하는 줄의 내용까지(단, 포함하지 않음)가 END-MARKER입력으로 제공됩니다. 하지만 본 문서에서는 변수 확장이 이루어지므로 본 문서에서 $variable또는 구문(및 기타 구문)을 사용할 수 ${variable}있으며 해당 내용으로 대체됩니다.

Bash 명령줄 명령과 달리 여기 Bash 문서의 인용문은 유지됩니다. 따라서 png값이 있으면 으로 X_001.out확장 set output "$png"되고 Gnuplot은 이를 로 처리합니다 set output "X_001.out".

답변2

예를 들어 입력 파일 및 출력 exe-template파일의 이름에 대해 템플릿 스크립트에 자리 표시자를 사용합니다 .X_inputX_input.png

set term png size 1600,1200
set output "X_input.png"
splot 'X_input'

그런 다음 루프에서 데이터 파일의 이름을 sed바꾸고 X_input결과 수정 스크립트를 임시 파일에 씁니다. 예 exe-tmp:

for i in X_[0-9][0-9][0-9] ; do
  sed -e 's/X_input/'${i}'/g' exe-template >exe-tmp
  chmod 755 ./exe-tmp
  ./exe-tmp
done

관련 정보