web-dev-qa-db-ja.com

Unixで2つのテキストファイルを比較する比較関数

ファイルのすべての行を比較するbashという関数がUNIXで利用できるかどうか誰かが教えてもらえないかと思っていました。それらが異なる場合は、true/falseまたは-1,0,1を出力する必要があります。私はこれらのcmp関数が他の言語で存在することを知っています。私はマニュアルページを見回してきましたが、うまくいきませんでした。それが利用できない場合、誰かが私に代替の解決策を考え出すのを手伝ってくれる?

ありがとう

13
Masterminder

これにはいくつかの方法があります。

  • cmp -s file1 file2$?の値を確認してください。両方のファイルが一致する場合はゼロ、そうでない場合はゼロ以外。
  • diff file1 file2 > /dev/nulldiffコマンドの一部の形式は、何も出力しないように指示するパラメーターを取ることができます。ただし、ほとんどはそうではありません。結局のところ、diffを使用して2つのファイルの違いを確認します。繰り返しになりますが、終了コード($?の値を確認できます。ファイルが一致する場合は0になり、それ以外の場合はゼロ以外になります。

シェルのifステートメントでこれらのコマンドを使用できます。

if cmp -s file1 file2
then
   echo "The files match"
else
   echo "The files are different"
fi

diffコマンドは、テキストファイル専用に作成されています。 cmpコマンドは、すべてのバイナリファイルでも機能するはずです。

34
David W.

シンプルなcmp file fileそれだけを行うコマンド。等しい場合は0を返し、異なる場合は1を返すため、ifsで使用するのは簡単です。

if cmp file1 file1; then
    ...
fi

これが役立つことを願って=)

#!/bin/bash

file1=old.txt
file2=new.txt

echo " TEST 1 : "
echo

if [ $( cmp -s ${file1} ${file2}) ]
then
   echo "The files match"
else
   echo "The files are different"
fi

echo
echo " TEST 2 : "
echo
bool=$(cmp -s "$file1" "$file2" )
if cmp -s "$file1" "$file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

echo
echo " TEST 3 : "
echo

md1=$(md5 ${file1});
md2=$(md5 ${file2});

mdd1=$(echo $md1 | awk '{print $4}' ) 
mdd2=$(echo $md2 | awk '{print $4}' ) 
echo $md1
echo $mdd1
echo $md2
echo $mdd2
echo

#if [ $mdd1 = $mdd2 ]; 
if [ $mdd1 -eq $mdd2 ]; 
then
   echo "The files match"
else
   echo "The files are different"
fi
1
kris

2つのファイルに対して md5 を実行し、bashの結果を比較できます。

テストするUnixボックスはありませんが、これは正しいはずです。

#!/bin/bash

md1=$(md5 file1);
md2=$(md5 file2);

if [ $md1 -eq $ $md2 ]; then
  echo The same
else
  echo Different
fi
0

エコー "最初のファイルの読み取り"読み取りf1エコー "2番目のファイルの読み取り"読み取りf2

diff -s f1 f2#両方のファイルが同一の場合に出力

0
sovick konar