Bashスクリプトで2つのファイルを比較しますか?

Bashスクリプトで2つのファイルを比較しますか?

シェルスクリプトの2つのファイルで一致するデータを見つけ、シェルの他のファイルに保存されている重複データを見つける方法は?

#!/bin/bash

file1="/home/vekomy/santhosh/bigfiles.txt"
file2="/home/vekomy/santhosh/bigfile2.txt"

while read -r $file1; do
    while read  -r $file2 ;do
        if [$file1==$file2] ;  then
            echo "two files are same"
        else
            echo "two files content different"
        fi
    done
done

コードを書きましたが、うまくいきませんでした。どのように書くのですか?

ベストアンサー1

両方のファイルが同じであることをテストするには、次のようにしますcmp -s

#!/bin/bash

file1="/home/vekomy/santhosh/bigfiles.txt"
file2="/home/vekomy/santhosh/bigfile2.txt"

if cmp -s "$file1" "$file2"; then
    printf 'The file "%s" is the same as "%s"\n' "$file1" "$file2"
else
    printf 'The file "%s" is different from "%s"\n' "$file1" "$file2"
fi

ユーティリティを「サイレント」にする-sフラグを指定します。cmp2つの同じファイルを比較すると、終了ステータスはcmp0になります。上記のコードでは、両方のファイルが同じかどうかに関するメッセージを印刷するために使用されます。


2つの入力ファイルがある場合パス名のリストが含まれています。比較するファイルを選択し、次の二重ループを使用します。

#!/bin/bash

filelist1="/home/vekomy/santhosh/bigfiles.txt"
filelist2="/home/vekomy/santhosh/bigfile2.txt"

mapfile -t files1 <"$filelist1"

while IFS= read -r file2; do
    for file1 in "${files1[@]}"; do
        if cmp -s "$file1" "$file2"; then
            printf 'The file "%s" is the same as "%s"\n' "$file1" "$file2"
        fi
    done
done <"$filelist2" | tee file-comparison.out

ここで結果は端末とファイルの両方で生成されますfile-comparison.out

両方の入力ファイルのパス名に改行文字が含まれていないとします。

files1コードは、ファイルの1つのすべてのパス名を配列として読み取ることから始まりますmapfile。他のファイルの各パス名のすべてのパス名を繰り返す必要があるため、ファイルを何度も読み取らないようにします。$filelist1内部ループから読み取るのではなく、配列の名前を繰り返していることがわかりますfiles1

おすすめ記事