0

diffは使用できず、cmpも使用できません。

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

#!/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 ボックスであるため、このサーバーに追加できるものは非常に限られています。

4

2 に答える 2

4

以下を使用できるはずです。

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

コマンドは、comm違いが見つかったかどうかに関係なく成功します (ステータス 0 で終了します)grepが、一致が見つかった場合にのみ成功します。-qgrep が一致を出力するのを防ぎ、パターンは'.*'にでも一致します。したがって、入力が空でない場合は成功します。ただし、一致した場合は成功したいので、最初に を追加してステータスを反転させました。grep -q '.?'!

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

ところで、$?ゼロかどうかのテストは不要です。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
于 2016-07-12T00:59:02.583 に答える
0

commの出力をパイプして、wc -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

comm使用するコマンドを変更して-13、新しいファイルを出力するようにしました。

于 2016-07-12T01:00:38.400 に答える