İki dosyayı kabuk komut dosyasıyla nasıl karşılaştırırım?


10

İki dosya verildiğinde, dosya1'deki her satırı okuyan ve dosya2'de olup olmadığını kontrol eden bir kabuk komut dosyası yazmak istiyorum. Bir satır bulunamazsa, iki dosya farklı olmalı ve çıkmalıdır. Dosyalar kelime numaraları veya herhangi bir şey içerebilir. Örneğin :

dosya1:

Hi!
1234
5678
1111
hello

dosya2:

1111
5678
1234
Hi!
hello

Bu durumda iki dosya eşit olmalıdır. dosya2 "merhaba !!!" "merhaba" yerine dosyalar farklıdır. Ben bash betiği kullanıyorum. Bunu nasıl yapabilirim. İç içe geçmiş bir döngüde yapmam önemli değil ama tek yol olduğunu düşündüm. Yardımın için teşekkürler.

Yanıtlar:



10

diffçıkış durumunu dosyaların aynı olup olmadığını gösterecek şekilde ayarlar. Özel değişkente çıkış durumuna erişilebilir $?. Ignacio'nun cevabını şu şekilde genişletebilirsiniz:

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

3
Sadece if diff ... >/dev/nullparantez ve değişken olmadan yapabilirsiniz .
sonraki duyuruya kadar duraklatıldı.

1

Bunu eklediğim için [[]] && || yapı oldukça temiz:

#!/bin/bash

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

1

Ayrıca çalışması gerekir:

comm -3 file1 file2

Bunun bir cevap için yeterli karakter olduğunu düşünüyorum ...


1

diffMükemmel bir cevap olsa da, muhtemelen cmpiki dosyanın bayt byte karşılaştırmasını yapmak için kullanacağım .

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

Bu nedenle, ikili dosyaları karşılaştırabilme avantajı vardır.

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

Bunu diffkişisel olarak test etmeme rağmen kullanmaktan daha hızlı olduğuna inanıyorum .


İlk önce "dosyalar farklı" durumda olmaz mı? İf testi bir şeyin doğru olup olmadığını sorar, yani sıfır olmayan bir dönüş kodu. Dosyalar eşleşirse, cmp 0 (manpage başına) değerini döndürür ve bu nedenle ikinci durum olmalıdır.
user8162

@ user8162 Söyledikleriniz mantıklı, ancak ben sadece test ettim ve doğru yol bu. Dürüst olmak gerekirse durumun neden olduğundan emin değilim.
Richard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.