รายชื่อไดเรกทอรีควรทำงาน; เช่นนี่คือสิ่งที่ฉันใช้ในสคริปต์ (สมมติว่า gnu diff)
diff -r \
--exclude="*~" \
--exclude=".svn" \
--exclude=".git" \
--exclude="*.zip*" \
--exclude="*.gz" \
--exclude="*.tar" \
...etc
... ซึ่งไม่สนใจเนื้อหาของ.svn
และ.git
dirs แต่ยังรวมถึงไฟล์แต่ละชื่อ*.zip
/ *.gz
/ ฯลฯ
แก้ไข:เพื่อกรองพา ธ ของฟอร์มdir_a/file1
แต่ยังคงdiff
ไฟล์ที่มีชื่อไฟล์เหมือนกันเช่นdir_b/file1
หรือdir_a/b/file1
จากนั้นdiff
จะต้องสร้างรายการไฟล์ที่จะต้องสร้าง (ตัวอย่างเช่นการใช้find
) และไฟล์เพื่อเปรียบเทียบที่ได้มาจากพา ธ เหล่านี้ เช่นได้รับ
$ find ONE TWO -type f -print
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt
คุณสามารถสร้างรายชื่อของไฟล์ที่จะเปรียบเทียบไม่รวมตัวอย่างเช่น*/a/2.txt
แต่ยังคงเปรียบเทียบไฟล์อื่น ๆ 2.txt
ชื่อ เพียงแค่ "ค้นหา" ไฟล์ทั้งหมดยกเว้นONE/a/2.txt
(สามารถใช้ regexp ที่นี่เช่น.*/a/2.txt
)
$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
-exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;
ซึ่งผลจะไม่สนใจONE/a/2.txt
(และTWO/a/2.txt
) แต่ยังคงเปรียบเทียบไฟล์อื่น ๆ ที่ชื่อ2.txt
:
diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt
แก้ไข:หรือเพิ่มความสนุกด้วยfind
(เหลือความสนุกเพิ่มเติมสำหรับการออกกำลังกายสำหรับผู้อ่าน) เลือกไฟล์หรือไดเรกทอรีที่จะแยกออกจากนั้นทำdiff
อย่างอื่น:
$ find ONE \( -regex 'ONE/a/2.txt' -o -name b -prune \) \
-o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \
ตัวอย่างด้านบนไม่รวมไฟล์เฉพาะ "{top} /a/2.txt", ไดเรกทอรีใด ๆ ที่ชื่อ "b" และทุกอย่างอื่นจะแตกต่างกัน (แทนที่จะใช้ "" อย่างง่าย-name b
คุณสามารถใช้ " -regex '.*/b'
" - โน้ตได้โดยไม่ต้องต่อท้าย "/")
diff
ของ--exclude
ตัวเลือกเพื่อให้เชี่ย ...