web-dev-qa-db-ja.com

シェルスクリプトで2つのファイルを比較するにはどうすればよいですか?

2つのファイルがあるとすると、file1から各行を読み取り、それがfile2にあるかどうかを確認するシェルスクリプトを作成します。行が見つからない場合は、2つのファイルが異なり、終了するはずです。ファイルには、単語番号などを含めることができます。例えば ​​:

file1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hello

この場合、2つのファイルは等しいはずです。 file2に「hello !!!」がある場合「こんにちは」の代わりに、ファイルは異なります。私はbashスクリプトを使用しています。これどうやってするの。ネストされたループでそれを行う必要があることは重要ではありませんが、それが唯一の方法であると私が考えたものです。ご協力いただきありがとうございます。

10
0x0

バッシュで:

diff --brief <(sort file1) <(sort file2)

diffは、終了ステータスを設定して、ファイルが同じかどうかを示します。終了ステータスは、特殊変数$?でアクセスできます。このようにして、イグナシオの答えを拡張できます。

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi
10
Doug Harris

も動作するはずです:

comm -3 file1 file2

答えにはこれで十分だと思います...

1
mpez0

[[]] && ||と思うので、これを追加します構成はかなりきれいです:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")
1
mmrtnt

diffは完全に適切な回答ですが、おそらく2つのファイルのバイトごとの比較を行うためのcmpを代わりに使用するでしょう。

https://linux.die.net/man/1/cmp

このため、バイナリファイルを比較できるという追加のボーナスがあります。

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

個人的にはテストしていませんが、diffを使用するよりも高速だと思いました。

1
Richard