คุณแตกต่างไดเร็กทอรีสำหรับเฉพาะไฟล์บางประเภทได้อย่างไร?


88

ฉันมีคำถามเกี่ยวกับคำสั่ง diff หากฉันต้องการให้ไดเร็กทอรีแบบเรียกซ้ำ diff แต่สำหรับไฟล์บางประเภทเท่านั้นจะทำอย่างไร

ฉันลองใช้ตัวเลือกการยกเว้น แต่สามารถใช้ได้เพียงรูปแบบเดียวเท่านั้น:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml

ที่มีคำสั่งฉันเท่านั้นที่สามารถแยกประเภทของไฟล์ XML, แม้ว่าจะมีไฟล์ในรูปแบบภาพโฟลเดอร์ ( png, gif, jpg) txt, phpฯลฯ

วิธีการแตกต่างเฉพาะไฟล์บางประเภท



คุณกำลังพยายามที่จะทำให้ไฟล์บางประเภทแตกต่างกันหรือไม่รวมไฟล์เหล่านั้นจากการแตกต่างกัน? คำถามไม่ตรงกับคำอธิบาย ..
def

คำตอบ:


98

คุณสามารถระบุได้-xมากกว่าหนึ่งครั้ง

diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2

จากส่วนการเปรียบเทียบไดเรกทอรีของinfo diff(ในระบบของฉันฉันต้องทำinfo -f /usr/share/info/diff.info.gz):

หากต้องการละเว้นไฟล์บางไฟล์ในขณะที่เปรียบเทียบไดเร็กทอรีให้ใช้ตัวเลือก '-x PATTERN' หรือ '--exclude = PATTERN' อ็อพชันนี้ละเว้นไฟล์หรือไดเร็กทอรีย่อยที่มีชื่อฐานตรงกับรูปแบบเชลล์ PATTERN ไม่เหมือนกับในเชลล์ช่วงเวลาที่จุดเริ่มต้นของฐานของชื่อไฟล์จะตรงกับสัญลักษณ์แทนที่จุดเริ่มต้นของรูปแบบ คุณควรใส่ PATTERN ในเครื่องหมายคำพูดเพื่อไม่ให้เชลล์ขยาย ตัวอย่างเช่นอ็อพชัน-x '*. [ao]'จะละเว้นไฟล์ใด ๆ ที่มีชื่อลงท้ายด้วย ".a" หรือ ".o"

ตัวเลือกนี้จะสะสมหากคุณระบุมากกว่าหนึ่งครั้ง ตัวอย่างเช่นการใช้อ็อพชัน-x 'RCS' -x '*, v'จะละเว้นไฟล์หรือไดเร็กทอรีย่อยที่มีชื่อฐานเป็น 'RCS' หรือลงท้ายด้วย ', v'


Mine (ubuntu 10.04) ไม่มีบรรทัดเหล่านี้ ฉันลองแล้วและมันก็ไม่ได้ผล ฉันเดาว่านี่เป็นเวอร์ชันใหม่
alumi

22

นำมาจาก (เวอร์ชันหนึ่ง) หน้าคน:

-x PAT  --exclude=PAT
  Exclude files that match PAT.

-X FILE    --exclude-from=FILE
  Exclude files that match any pattern in FILE.

ดูเหมือนว่า-xจะยอมรับเพียงรูปแบบเดียวตามที่คุณรายงาน แต่ถ้าคุณใส่รูปแบบทั้งหมดที่คุณต้องการยกเว้นในไฟล์ (น่าจะเป็นหนึ่งรูปแบบต่อบรรทัด) คุณสามารถใช้แฟล็กที่สองดังนี้:

$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats

โดยที่ exclude.pats คือ:

*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif

4
คุณสามารถค้นหานามสกุลไฟล์ทั้งหมดภายในโฟลเดอร์ของคุณยกเว้นส่วนขยาย <my-ext> โดยใช้บรรทัดคำสั่งต่อไปนี้:find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
John

ฉันหวังว่าฉันจะสังเกตเห็นความคิดเห็นของจอห์นก่อนหน้านี้ แต่สำหรับ macOs / bash ฉันมาถึงวิธีแก้ปัญหาที่คล้ายกันเพื่อสร้างไฟล์การยกเว้นที่มีรูปแบบต่างๆให้เก็บไว้: find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILEฉันอยากจะเชื่อว่ามันช่วยได้อาจจะเป็นบน Linux ด้วย (ในตัวอย่างนี้ซิงเกิ้ล-name "*.[ch]"ก็โอเค แต่ไม่ใช่ตัวอย่างมาก)
eruve

16

คุณยังสามารถใช้ find กับ -exec เพื่อเรียก diff:

cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;

7

การขาดการเสริม - รวมถึง ...

เราสามารถแก้ปัญหาเบื้องต้นได้หนึ่งไฟล์ยกเว้นไฟล์ที่มีไฟล์ทั้งหมด แต่สิ่งที่เราต้องการรวมไว้ด้วย ดังนั้นเราจึงสร้างfile1ด้วยการค้นหาไฟล์ทั้งหมดที่ไม่มีนามสกุลที่เราต้องการรวมsedจับชื่อไฟล์และเป็นเพียง:

diff --exclude-from=file1  PATH1/ PATH2/

ตัวอย่างเช่น:

find  PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 
diff PATH1/ PATH2/ -rq -X file1 

หนึ่งซับที่มีประโยชน์สุด ๆ ขอบคุณ บน Mac OSX grep แตกต่างกันเล็กน้อยและกลายเป็น find PATH1/ -type f | grep --text -v -e "php$" -e html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
mmacvicar

3

ฉันใช้คำสั่งต่อไปนี้เพื่อค้นหาความแตกต่างของ*.tmplไฟล์ทั้งหมดระหว่างDIR1และDIR2. ในกรณีของฉันสิ่งนี้ไม่ได้ให้ผลบวกที่ผิดพลาด แต่อาจสำหรับคุณขึ้นอยู่กับเนื้อหาของ DIRS ของคุณ

diff --brief DIR1 DIR2 | grep tmpl


2

หากคุณต้องการแหล่งที่มาที่แตกต่างกันและทำให้ง่าย:

diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"

ลบ grep สุดท้ายหากคุณต้องการรับไฟล์ที่มีอยู่ในพา ธ เดียวเท่านั้น


ฉันชอบความเรียบง่าย :-) ในการเปลี่ยนภาษาเยอรมันgrep "^Files"เป็นgrep "^Dateien"
Erich Kuester

2

Makefileในกรณีที่คุณพบมันง่ายคุณสามารถใช้ต่อไปนี้ เพียงแค่เรียกใช้: "make patch"

#Makefile for patches

#Exlude following file endings
SUFFIX += o
SUFFIX += so
SUFFIX += exe
SUFFIX += pdf
SUFFIX += swp

#Exlude following folders
FOLDER += bin
FOLDER += lib
FOLDER += Image
FOLDER += models

OPTIONS = Naur

patch: 
    rm test.patch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
        org/ new/ > test.patch  

unpatch: 
    rm test.unpatch
    diff -$(OPTIONS) \
    $(foreach element, $(SUFFIX) , -x '*.$(element)') \
    $(foreach element, $(FOLDER) , -x '$(element)*') \
    new/ org/ > test.unpatch


0

แม้ว่าจะไม่หลีกเลี่ยงความจริงdiffของไฟล์อื่น ๆ หากเป้าหมายของคุณคือการสร้างไฟล์แพตช์หรือสิ่งที่คล้ายกันคุณสามารถใช้filterdiffจากpatchutilsแพ็คเกจเช่นเพื่อแก้ไขเฉพาะ.pyการเปลี่ยนแปลงของคุณ:

diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.