File1 dosyasının file2 öneki olup olmadığını nasıl kontrol edebilirim?


13

Bayt cinsinden 124665 ve 124858 boyutlarında iki dosyam var ve file1'in dosya2 öneki olup olmadığını kontrol etmek istiyorum.

Yanıtlar:


11

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

@ StéphaneChazelas Lütfen neden cmpbundan daha iyi olacağını açıklayabilir misiniz diff?
Joseph R.

7
Çünkü 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.
Stéphane Chazelas

12

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

@StephaneChazelas Burada kendimi ikinci olarak tahmin ediyorum ama $(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?
steeldriver

2
hayır, çoğu 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.
Stéphane Chazelas

1
GNU'ya özgü cmpolmanız gerekecek olsa da, GNU'ya özel olarak kabul edilebilirsiniz stat.
Barmar

3

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.


1
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.
Stéphane Chazelas

Yapabilirsincmp file1 file2 2>&1 | grep EOF on file1
David Z

@ StéphaneChazelas: Bu doğru. Bunun GNU'ya 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.
Nate Eldredge

@DavidZ: Evet, yapabilirdiniz, ancak biraz daha az sağlamlaşıyor. Bunu kullanıcı tarafından sağlanan iki dosyayla yapmaya çalıştığınızı ve bunlardan birinin adının 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 ...
Nate Eldredge'i

Bununla birlikte, bir C programının pratik olmadığı bağlamlar olabilir. Ve bunu oldukça sağlam hale getirmek o kadar da zor değil, çünkü çıktısı 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.
David Z
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.