Yanıtlar:
file1Değişkenin boyutuna sahip olduğunuzu FILE1_SZve headuygulamanızın (standart dışı) -cseçeneğini desteklediğini varsayarsak :
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmpbasit bir bayt-byte karşılaştırması yapar ve fark bulur bulmaz geri döner, diffumursadığınız iki dosya arasındaki tüm farkları göstermek için karmaşık bir algoritma kullanacak bir metin yardımcı programıdır.
Sisteminizde cmpGNU komutu varsa, diffutilsbir seçenek
cmp -n 124665 file1 file2
iki dosyanın en fazla ilk 124665 baytını karşılaştırmak ve farklı olup olmadıklarını veya daha genel olarak
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)bayt cinsinden boyut önermek daha iyi olur muydu? Does wcaslında açık ve bayt sayısını almak için tüm dosyayı işlemek?
wcuygulama bu durumu optimize eder ve bir fstat()(veya / ve a lseek(SEEK_END)) yapar, böylece olabildiğince verimli olur. Diğer yandan, bu stat -cGNU'ya özgüdür.
cmpolmanız gerekecek olsa da, GNU'ya özel olarak kabul edilebilirsiniz stat.
GNU cmpsorunu daha kolay bir şekilde çözebilir:
cmp file1 file2
Dört olası çıkış vardır (bir tür hatanın engellenmesi).
Çıktı yok: dosyalar aynı.
cmp: EOF on file1: dosya1, dosya2'nin bir önekidir.
cmp: EOF on file2: dosya2, dosya1'in bir önekidir.
file1 file2 differ: byte NNN, line MMM: İkisi de diğerinin öneki değildir.
Ne yazık ki bu bir komut dosyasında kullanmak biraz garip, çünkü bu durumlar çıkış kodunda ayırt edici görünmüyor. Ayrıca, EOF on file1mesajlar stderr'a giderken, file1 file2 differmesajlar stdout'a gider.
Diğer sürümlerinin cmpbenzer bir şey yaptığını varsayıyorum, ancak kontrol etmedim.
cmpsadece bir GNU komutu değildir ve oradan da gelmemiştir, zaten 70'lerin başında Unix'in ilk versiyonundaydı. -nSeçenek GNU özgü olsa.
cmp file1 file2 2>&1 | grep EOF on file1
cmpözgü olduğunu ima etmek istemedim , sadece GNU'nun cmpdenediğim tek versiyon olduğunu. Açıklığa kavuşturmak için bir cümle ekledim.
file1diğerinin adının verildiğini düşünün file12. (Ya da daha kötüsü, ikinci dosya ne adlandırılır eğer EOF on file1?) Sağlam kullanarak bu Çözme cmpmuhtemelen çok fazla sorun C bariz 5 satır programını yazarken daha ...
cmpçok sıkı. Tüm satırı eşleştirmek için -xaçık seçeneğini kullanmak, grepen egzotik durumlar dışında (örneğin dosya adındaki yeni satırlar) ilgilenecektir.
cmpbundan daha iyi olacağını açıklayabilir misinizdiff?