โดยทั่วไปคุณจำเป็นต้องเปรียบเทียบสองไฟล์โดยไม่สนใจไบต์ต่อท้าย ไม่มีตัวเลือก 'diff' ในการทำเช่นนี้ - แต่มีหลายวิธีที่สามารถทำได้ (เช่น hex diff ต่างก็คำนึงถึงเช่นกัน)
ในการใช้ 'diff' โดยทั่วไปคุณจะต้องแก้ไขไฟล์ที่ขาดการขึ้นบรรทัดใหม่ที่ท้ายไฟล์แล้วจึงทำการเปรียบเทียบ คุณสามารถสร้างไดเรกตอรีชั่วคราวด้วยไฟล์ที่ถูกดัดแปลงหรือการเขียนสคริปต์เล็กน้อยสามารถทำได้ในหน่วยความจำ (ตามที่ต้องการจะขึ้นอยู่กับการตั้งค่าขนาดไฟล์จำนวนไฟล์ ... )
ตัวอย่างเช่นต่อไปนี้จะแก้ไขเนื้อหาของไฟล์ (ใช้sed -i
เพื่อแก้ไขในสถานที่นี้เพียงพิมพ์ไปยัง stdout) เพื่อเพิ่มบรรทัดใหม่หากมีการขาดหายไป (หรือปล่อยให้ไฟล์ไม่เปลี่ยนแปลงหากมีการขึ้นบรรทัดใหม่แล้ว):
sed -e '$a\' file1.txt
และเพื่อตรวจสอบไวยากรณ์ 'diff' (การคืนค่าจริงหมายถึงพวกมันเหมือนกันเท็จหมายถึงต่างกัน):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
ตรวจสอบว่าช่องว่างเท่านั้นต่างกัน:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
ในทุบตีเราสามารถใช้ 'sed' เพื่อจัดการเนื้อหาไฟล์ในขณะที่ส่งผ่านไปยัง 'diff' (ไฟล์ต้นฉบับไม่เปลี่ยนแปลง):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
ตอนนี้สิ่งที่คุณต้องทำคือเลียนแบบdiff -r
เพื่อเปรียบเทียบไดเรกทอรีซ้ำ หากเปรียบเทียบไดเรกทอรีa
และb
แล้วสำหรับไฟล์ทั้งหมดในa
(เช่นa/dir1/dir2/file.txt
) เส้นทางการสืบทอดมาเป็นแฟ้มในb
(เช่นb/dir1/dir2/file.txt
) และเปรียบเทียบ:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
รุ่น verbose เพิ่มเติมเล็กน้อย:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same
sed -e '$a\'
ได้มั้ย ขอบคุณ