2016-07-12 6 views
0

diffを使用できず、cmpを使用できません。bashは2つのファイルの内容を比較し、結果に基づいて2つの異なる動作を行います

通信を使用することはできますが、スクリプトで条件付きで使用すると正しい結果が得られません。

#!/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 

それは常に返します。ファイルCOMMコマンドとして

での変更はありません

、正常に実行されますが、ファイルの内容が異なっています。

企業の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'はnew.txtにないold.txtの行を返します。 old.txtにないnew.txtの行は無視されます。それはあなたが欲しいものですか? – John1024

答えて

2

あなたは使用することができるはずです。 -qはgrepがマッチを印刷するのを防ぎ、パターン'.*'と一致します。。したがって、入力が空でない場合、grep -q '.?'は成功します。しかし、一致があった場合は成功したかったので、最初に!を追加してステータスを逆転させました。

私はまた別の変更を加えました:comm -23は、最初のファイル(old.txt)にあり、2番目のファイル(new.txt)にはない行を出力しますが、最初のものではありません。 comm -3は、ファイルの1つに固有のすべての行を出力するので、削除された行は2つのファイルの間に追加されたまたはです。

ところで、$?がゼロかどうかをテストする必要はありません。見つかった新しいファイルがあった場合wc -lからcommの出力を見るために

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

パイプ:ちょうどif条件として直接コマンドを使用します。

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

関連する問題