ฉันมีสองไฟล์ที่มีขนาด 124665 และ 124858 ในหน่วยไบต์และต้องการตรวจสอบว่า file1 เป็นคำนำหน้าของ file2 หรือไม่
ฉันมีสองไฟล์ที่มีขนาด 124665 และ 124858 ในหน่วยไบต์และต้องการตรวจสอบว่า file1 เป็นคำนำหน้าของ file2 หรือไม่
คำตอบ:
สมมติว่าคุณมีขนาดของfile1
ตัวแปรFILE1_SZ
และhead
การใช้งานของคุณรองรับ-c
ตัวเลือก(ที่ไม่ได้มาตรฐาน) :
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
ทำการเปรียบเทียบแบบไบต์ต่อไบต์แบบง่ายๆและจะส่งคืนทันทีที่พบความแตกต่างขณะที่diff
ยูทิลิตีข้อความจะใช้อัลกอริทึมแบบซับซ้อนเพื่อแสดงความแตกต่างระหว่างไฟล์ทั้งสองที่คุณไม่สนใจ
หากระบบของคุณมีcmp
คำสั่งจาก GNU แสดงdiffutils
ตัวเลือกเดียวคือ
cmp -n 124665 file1 file2
เพื่อเปรียบเทียบสูงสุด 124665 ไบต์แรกของทั้งสองไฟล์และรายงานหากมีความแตกต่าง - หรือมากกว่าโดยทั่วไป
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
สำหรับขนาดเป็นไบต์? ไม่wc
จริงเปิดและประมวลผลไฟล์ทั้งหมดจะได้รับการนับไบต์?
wc
การใช้งานส่วนใหญ่จะปรับให้เหมาะสมกรณีและทำfstat()
(หรือ / และ a lseek(SEEK_END)
) ดังนั้นจะมีประสิทธิภาพเท่าที่ได้รับ ในทางตรงกันข้ามนั่นstat -c
คือ GNU เฉพาะ
cmp
คุณสมควรอาจคิด stat
GNU
GNU cmp
สามารถแก้ปัญหาด้วยวิธีที่ง่ายกว่า:
cmp file1 file2
มีเอาต์พุตที่เป็นไปได้สี่แบบ (ยกเว้นข้อผิดพลาดบางประเภท)
ไม่มีผลลัพธ์: ไฟล์เหมือนกัน
cmp: EOF on file1
: file1 เป็นคำนำหน้าของ file2
cmp: EOF on file2
: file2 เป็นคำนำหน้าของ file1
file1 file2 differ: byte NNN, line MMM
: ทั้งสองเป็นคำนำหน้าของอื่น ๆ
น่าเสียดายที่นี่ไม่ค่อยน่าใช้ในสคริปต์เนื่องจากกรณีเหล่านี้ดูเหมือนจะไม่แตกต่างในรหัสออก นอกจากนี้EOF on file1
ข้อความจะไปที่ stderr ในขณะที่file1 file2 differ
ข้อความนั้นจะไปที่ stdout
ฉันคิดว่ารุ่นอื่น ๆcmp
ทำสิ่งที่คล้ายกัน แต่ฉันยังไม่ได้ตรวจสอบ
cmp
ไม่ใช่คำสั่งเดียวของ GNU และไม่ได้มีต้นกำเนิดมาจากมันมีอยู่แล้วในรุ่นแรกของ Unix ในต้นปี 70 -n
ตัวเลือกที่ GNU เฉพาะแม้ว่า
cmp file1 file2 2>&1 | grep EOF on file1
cmp
มันเป็นเอกลักษณ์ของ GNU เพียงแค่ GNU cmp
เป็นรุ่นเดียวที่ฉันลอง ฉันเพิ่มประโยคเพื่อชี้แจง
file1
และอีกชื่อfile12
หนึ่ง (หรือแย่ลงยังสิ่งที่ถ้าไฟล์ที่สองคือชื่อEOF on file1
?) การแก้นี้ทนทานใช้cmp
น่าจะเป็นปัญหามากขึ้นกว่าการเขียนโปรแกรมที่เห็นได้ชัด 5 บรรทัดใน C ...
cmp
ข้อ จำกัด นั้นแน่น การใช้-x
ตัวเลือกในgrep
การจับคู่ทั้งบรรทัดจะดูแลทุกกรณียกเว้นกรณีที่แปลกใหม่ที่สุด (เช่นบรรทัดใหม่ในชื่อไฟล์)
cmp
ได้diff
ไหมว่าทำไมถึงดีกว่าที่นี่