ค้นหาโฟลเดอร์ซ้ำ แต่ไม่รวมโฟลเดอร์ย่อย svn


10

ฉันต้องการค้นหาสิ่งที่เกิดขึ้นทั้งหมดfooในระบบไฟล์ขนาดใหญ่ที่ดูแลโดย SVN แต่ฉันไม่ต้องการจับคู่สิ่งที่มีอยู่ใน.svnไดเรกทอรีใด ๆ

ฉันได้รับการจับคู่ทันทีเมื่อฉันทำgrep -l -e 'foo' *แต่เมื่อฉันลองและแยกไดเรกทอรี svn ด้วยgrep -l -e 'foo' --exclude-dir=".svn"คำสั่งเพียงแค่หยุดทำงาน

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


11

--exclude-dirไม่ได้แทนที่ความต้องการในการแสดงรายการไฟล์บนบรรทัดคำสั่ง คุณกำลัง "หยุด" เนื่องจากgrepกำลังรออินพุตมาตรฐาน

grep -l -e 'foo' --exclude-dir = ". svn" *

พิจารณาใช้ackซึ่งแยก.svnและโฟลเดอร์ที่คล้ายกัน (และมีคุณสมบัติอื่น ๆ ) ตามค่าเริ่มต้น


2
ทำความสะอาดหากคุณเปลี่ยน*เป็น.ในกรณีที่มีโฟลเดอร์อื่นที่ซ่อนอยู่ซึ่งควรจะค้นหา
เควิน

หรือบางทีคุณอาจต้องการที่จะใช้--recursive .แทนเห็นเป็น OP แล้วมี grepGNU
jw013

โดยส่วนตัวแล้วฉันshopt -s dotglobอยู่ใน Bash ดังนั้นจึง*มีจุดไฟล์อยู่แล้ว -rเป็นสิ่งที่ดี แต่ackไม่ว่าโดยปกติมากเกินไป :)
ephemient

5

คุณอาจจะสนใจในการแอ๊กชั่น มันจะทำการค้นหาแบบเรียกซ้ำ (และการดำเนินการคล้าย grep อื่น ๆ ) และแยกไดเรกทอรีเช่น. svnหรือ. gitตามค่าเริ่มต้น


จากการติดตามเรื่องนี้ฉันใช้ในปัจจุบันagซึ่งคล้ายกัน แต่เร็วกว่า
WhyNotHugo

2

grep --exclude-dir...วิธีการแก้ปัญหาควรจะปรับ แต่เพียงเพื่อแสดงวิธีการอื่นที่คุณสามารถทำเช่นนี้กับfind's -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

หากคุณต้องการที่จะดำเนินการบางอย่างเพิ่มเติมfindจะดีกว่าธรรมดาgrep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

หากคุณไม่ต้องการ grep ลงในไดเรกทอรีเช่น.svn เคยคุณสามารถตั้งค่า$GREP_OPTIONSตัวแปรให้แยกออกได้ดังนี้:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

เพียงเพิ่มบรรทัดนี้ลงใน.bashrcgreps ที่คุณวนซ้ำและจะไม่ใส่ลงใน.svnไดเรกทอรีอีกต่อไป แน่นอนมันสามารถรวยได้เท่าที่คุณต้องการ:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
ฉันทำสิ่งนี้เป็นการส่วนตัวโดยใช้นามแฝงเพื่อที่ฉันจะสามารถข้ามรายการยกเว้นได้หากฉันต้องการค้นหาภายในโฟลเดอร์เหล่านั้นฉันสามารถใช้ grep เปลือยโดยไม่ต้องยกเลิกการตั้งค่า / โมฆะตัวแปร นอกจากนี้ยังช่วยให้ฉันรักษารายการโฟลเดอร์ที่ฉันสามารถขยายได้อย่างง่ายดายและเพิ่มลงในรายการยกเว้นโดยอัตโนมัติโดยไม่ต้องพิมพ์เพิ่มอีก
dragon788

นั่นเป็นวิธีการที่ดี นอกจากนี้ยังมีข้อได้เปรียบที่ถ้าคุณต้องการ grep ลงในโฟลเดอร์คุณจะไม่ลืมว่าคุณตั้งค่าตัวแปร (ไม่ใช่ว่าฉันจำเป็นต้อง grep พวกเขา) แต่ TBH ทุกวันนี้ฉันใช้ag (an ack clone) สำหรับสิ่งเหล่านี้ ^^
brandizzi

0

นี่เป็นวิธีแก้ปัญหา awk เช่นกัน:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

โดยพื้นฐานจากไฟล์ทั้งหมดให้ตัดไฟล์ที่ตรงกับ /.svn/ จากนั้นพิมพ์เฉพาะไฟล์ที่ตรงกับ / foo / ฉันชอบโซลูชันนี้เพราะคุณสามารถใช้ผลลัพธ์กับ ls ได้อย่างง่ายดาย ตัวอย่างเช่นคุณสามารถใช้

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

เพื่อดูมุมมองรายการเรียงตามวันที่แก้ไข นอกจากนี้ยังเป็นเรื่องดีที่มีเส้นทางแบบเต็มของผลลัพธ์หากคุณต้องการทำอย่างอื่นกับพวกเขา (เปิดพวกเขาดำเนินการ ฯลฯ )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.