Yanıtlar:
file1
Değişkenin boyutuna sahip olduğunuzu FILE1_SZ
ve head
uygulamanızın (standart dışı) -c
seç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
cmp
basit bir bayt-byte karşılaştırması yapar ve fark bulur bulmaz geri döner, diff
umursadığı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 cmp
GNU komutu varsa, diffutils
bir 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 wc
aslında açık ve bayt sayısını almak için tüm dosyayı işlemek?
wc
uygulama 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 -c
GNU'ya özgüdür.
cmp
olmanız gerekecek olsa da, GNU'ya özel olarak kabul edilebilirsiniz stat
.
GNU cmp
sorunu 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 file1
mesajlar stderr'a giderken, file1 file2 differ
mesajlar stdout'a gider.
Diğer sürümlerinin cmp
benzer bir şey yaptığını varsayıyorum, ancak kontrol etmedim.
cmp
sadece bir GNU komutu değildir ve oradan da gelmemiştir, zaten 70'lerin başında Unix'in ilk versiyonundaydı. -n
Seçenek GNU özgü olsa.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
özgü olduğunu ima etmek istemedim , sadece GNU'nun cmp
denediğim tek versiyon olduğunu. Açıklığa kavuşturmak için bir cümle ekledim.
file1
diğ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 cmp
muhtemelen ç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 -x
açık seçeneğini kullanmak, grep
en egzotik durumlar dışında (örneğin dosya adındaki yeni satırlar) ilgilenecektir.
cmp
bundan daha iyi olacağını açıklayabilir misinizdiff
?