2016-12-21 8 views
1

메일에 diff을 보내기 위해 파일에 bash 스크립트를 작성 중입니다. 나는 매 순간동일한 파일을 비교하고 리눅스에서 메일을 보내는 방법

* * * * 0-5 script.sh 
를 실행하는 스크립트 위 예약 한

file="https://stackoverflow.com/a/b/c/xyz.conf" 

while true 
do 
    sleep 1 
    cmp -s $file ${file}_bkp 
     if [ $? > 0 ]; then 
      diff $file ${file}_bkp > compare.log 
      mailx -s "file compare" [email protected] < compare.log 
      sleep 2 
      cp $file ${file}_bkp 
      exit 
     fi 
done 

-

아래의 경우에 대한

, 내가 지금까지 을 비교 "xyz.conf""xyz.conf_bkp"로 두 개의 파일을 만들었습니다, 나는 아래 스크립트왔다

이 작업은 정상적으로 작동하지만 아래와 같이 다른 접근 방식을 사용하고 있습니다. 다른 백업 파일을 만들지 않고도 작업 할 수 있습니다. 여러 개의 파일을 작업해야만 좋은 해결책으로 보이지 않는 많은 백업 파일을 만들 수 있다고 상상해보십시오.

누구나 제안 할 수 있습니까?이 방법을 구현하는 방법은 무엇입니까?

+0

파이프 사용 ..... –

+0

파일을 변경할 가능성이있는 파일을 비교하려는 경우 백업이 필요합니다. 당신이 만들고 싶지 않은'compare.log' 파일입니까? – chepner

+0

안녕하세요 @chepner, compare.log 메일을 통해 나에게 diff를 보내고 있습니다. 우리는 그것을 피할 수 있고 파일에 쓰는 대신 diff를 우편으로 직접 보낼 수 있습니까? 그러나 많은 차이점이 발견되면 파일을 사용하지 않고도 많은 차이를 보내려면 어려울 것입니다. 가능하다면 알려주세요 – Kshitij8097

답변

0

나는 이렇게 쓰고 싶다.

while cmp "$file" "${file}_bkp"; do 
    sleep 2 
done 
diff "$file" "${file}_bkp" | mailx -s "file compare" [email protected] 
cp "$file" "${file}_bkp" 

나는 cmpdiff 모두 실행 방지하기 위해 싶었지만 mailx 실행해야하는지 여부를 확인할 때까지 임시 파일이나 파이프가 diff에서 데이터를 보유하지 않고 그이 가능 모르겠어요.

while diff "$file" "${file}_bkp"; do 
    sleep 2 
done | { 
    mailx -s "file compare" [email protected] 
    cp "$file" "${file}_bkp" 
    exit 
} 

diff 종료 상태가 0 인 경우에는 출력을 생성하지 않게는 최종적으로합니다 ( while 루프의 출력 등)의 출력은 파이프되어 0이 아닌 종료 상태를 가질 때 mailxcp을 실행하는 복합 명령. 기술적으로는 mailxcp 모두 파이프에서 읽을 수 있지만 mailxcp이 실행되기 전에 모든 데이터를 모두 소모하므로이 cp 명령은 표준 입력을 무시합니다.

+0

여기에 "exit"를 사용했는데 루프에서 빠져 나와야하는 차이점을 발견 한 것처럼 "exit"를 사용했습니다. "if loop "단지 – Kshitij8097

+0

이 경우, 외부 루프와 'sleep 1'을 삭제할 수 있습니다. 'diff'가 실제로 차이를 찾을 때까지 코드는 내부 루프에 머무를 것입니다. – chepner

+0

안녕하세요 @chepner, 위의 스크립트, 위의 스크립트는 계속 동일한 변경으로 이메일을 보내고 있습니다 – Kshitij8097