2016-07-12 2 views
0

diff을 사용할 수없고 cmp을 사용할 수 없습니다.bash는 두 파일의 내용을 비교하고 결과에 따라 두 가지 다른 작업을 수행합니다.

우리는 통신을 사용할 수 있지만 스크립트의 조건부와 함께 사용하면 올바른 결과를 얻지 못합니다.

#!/bin/bash 
# http://stackoverflow.com/a/14500821/175063 

comm -23 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) 
if [ $? -eq 0 ];then 
    echo "There are no changes in the files" 
else 
    echo "New files were found. Return code was $?" 
fi 

그것은 항상 반환 파일 통신 명령과

에는 변화가 없습니다

, 성공적으로 실행되지만 파일의 내용이 다릅니다.

기업용 LINUX 상자이므로이 서버에 추가 할 수있는 대상은 매우 제한적입니다.

! comm -3 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | grep -q '.*' 

comm 명령이 어떤 차이를 발견 여부 성공 (상태 0으로 종료)하지만이 일치하는 항목을 찾은 경우 grep에만 성공 :

+1

'comm'은 파일을 찾을 수 없거나 실패한 경우에도 항상 0을 반환합니다. 'comm'이 출력되는지 보려면 stdout을 검사해야합니다. – alvits

+0

파일은 어떻게 생겼습니까? '$? '는 줄 수가 아닌 마지막 프로세스의 종료 상태입니까? – dawg

+1

'$? '에 있습니다. 또한'comm -23'은 old.txt에 new.txt가 아닌 행을 반환합니다. old.txt에없는 new.txt의 행은 무시됩니다. 너가 원하는게 그거야? – John1024

답변

2

당신은 사용할 수 있어야합니다. -q은 grep이 일치 항목을 인쇄하지 못하게하고 '.*' 패턴은 과 일치합니다 (). 따라서 입력이 비어 있지 않으면 grep -q '.?'이 성공합니다. 하지만 일치하는 항목이 있으면 성공하기를 원했기 때문에 처음에는 상태를 반전하기 위해 !을 추가했습니다.

또 하나의 변경을했습니다. comm -23은 첫 번째 파일 (old.txt)에 있고 두 번째 파일 (new.txt)에없는 행은 인쇄하지만 그 행은 인쇄되지 않습니다. 두 번째지만 첫 번째는 아닙니다. comm -3은 파일 중 하나에 고유 한 모든 줄을 인쇄하므로 두 파일 사이에 또는이 추가 된 줄을 찾습니다.

현재, $?이 0인지 테스트하는 것은 필요하지 않습니다. 단지 if 조건으로 직접 명령을 사용하여 발견 된 새로운 파일이 있다면

if ! comm -3 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | grep -q '.*'; then 
    echo "There are no changes in the files" 
else 
    echo "New files were found. Return code was $?" 
fi 
+0

이것은 내가 찾고 있던 해결책이다! 감사!! – Leptonator

0

파이프 commwc -l의 출력을 볼 수 있습니다. 그 메시지는 당신이 원하는 시사 무엇 때문에

new_file_count=$(comm -13 <(sort /home/folder/old.txt) <(sort /home/folder/new.txt) | wc -l) 
if [ $new_file_count -eq 0];then 
    echo "There are no changes in the files" 
else 
    echo "New files were found. Count is $new_file_count" 
fi 

나는, 그래서 새 파일을 인쇄합니다 -13를 사용하는 comm 명령을 변경했습니다.

+0

수는 포함되지 않습니다. 파일은 공급 업체에서 업데이트됩니다. 파일 101.dat와 마찬가지로 102.dat로 업데이트되고 파일 101.dat는 삭제됩니다. 우리는이 예에서 파일 102.dat가 알려 지는지 알고 싶습니다. – Leptonator

+0

'old.txt'에없는'new.txt'에있는 줄의 수를 센다. 그래서'102.dat'가 새로운 파일에 있기 때문에 카운트는'1'이 될 것이지만, 이전 파일에는 없다. – Barmar

+0

삭제 된 행은 계산되지 않고'comm -23'에 의해 계산됩니다. – Barmar

관련 문제