วิธีการดำเนินการ grep ในไฟล์ทั้งหมดในไดเรกทอรี


219

ทำงานกับ xenserver และฉันต้องการดำเนินการคำสั่งในแต่ละไฟล์ที่อยู่ในไดเรกทอรีทำให้สิ่งต่าง ๆ ออกมาจากคำสั่งและต่อท้ายมันลงในไฟล์

ฉันชัดเจนในคำสั่งที่ฉันต้องการใช้และวิธีการ grep out สตริงตามที่ต้องการ

แต่สิ่งที่ฉันไม่ชัดเจนคือฉันจะใช้คำสั่งนี้กับแต่ละไฟล์ได้อย่างไรไปยังไฟล์ถัดไปจนกระทั่งไม่พบไฟล์เพิ่มเติม

คำตอบ:


228

grep $PATTERN *จะเพียงพอ โดยค่าเริ่มต้น grep จะข้ามไดเรกทอรีย่อยทั้งหมด อย่างไรก็ตามหากคุณต้องการ grep ผ่านพวกเขาgrep -r $PATTERN *เป็นกรณี


37
"grep -r $ PATTERN" เพียงพอแล้ว สำหรับ grep แบบเรียกซ้ำคุณไม่จำเป็นต้องระบุไฟล์ทั้งหมด
Cougar

1
ฉันจะรวมส่วนขยายหลายรายการได้อย่างไร เช่น. "* .cpp", "* .h" หรือไม่
Tomáš Zato - Reinstate Monica

1
@ Tomáš Zato เพียงจัดหารูปแบบไฟล์ทั้งหมดของคุณแทน grep $PATTERN *.cpp *.h*: หากคุณต้องการกฎที่เฉพาะเจาะจงมากขึ้นสำหรับไฟล์ที่ควรเป็น grepping ให้ใช้findคำสั่ง (ตรวจสอบคำตอบของ Rob)
umi

@umi หากฉันเรียกใช้grep -r x .ผลลัพธ์มาจากไฟล์ทั้งหมดของส่วนขยายทั้งหมด ถ้าฉันวิ่งไปgrep -r x *.scssกว่าที่ฉันไม่ได้รับผลลัพธ์
Chris

1
@Chris เป็นไปได้ว่าคุณไม่มี*.scssไฟล์ในไดเรกทอรีปัจจุบัน แต่มีบางส่วนที่ลึกกว่าในโฟลเดอร์ย่อยดังนั้น grep จึงไม่ค้นหาไฟล์ทั้งหมดที่คุณต้องการ คุณควรใช้--includeตัวเลือกเพื่อบอก grep ให้ค้นหาไฟล์ซ้ำที่ตรงกับรูปแบบเฉพาะ: grep -r x --include '*.scss' . (สังเกตเครื่องหมายคำพูดพวกเขาป้องกันไม่ให้รูปแบบถูกขยายโดยเชลล์) หรือเพียงแค่ใช้find(ดูคำตอบของ Rob)
umi

169

ใน Linux ปกติฉันใช้คำสั่งนี้เพื่อ grep ซ้ำสำหรับข้อความเฉพาะภายใน dir

grep -rni "string" *

ที่ไหน

r = เรียกซ้ำคือค้นหาไดเรกทอรีย่อยภายในไดเรกทอรีปัจจุบัน
n = เพื่อพิมพ์หมายเลขบรรทัดไปยัง stdout
i = การค้นหาแบบไม่คำนึงถึงขนาดตัวพิมพ์


32

ใช้ค้นหา อย่างจริงจังมันเป็นวิธีที่ดีที่สุดเพราะคุณจะเห็นไฟล์ที่ใช้งานได้จริง:

find . -name "*.sql" -exec grep -H "slow" {} \;

หมายเหตุ -H เป็นแบบเฉพาะสำหรับ Mac โดยจะแสดงชื่อไฟล์ในผลลัพธ์


7
หากคุณตัดสินใจที่จะใช้ find, ไพพ์เอาท์พุทxargsแทนที่จะใช้-execสิ่งนี้จะเร็วขึ้นมากเพราะ-execวางกระบวนการใหม่สำหรับ grep แต่ละตัวและโอเวอร์เฮดจะมีความสำคัญกับไฟล์จำนวนมาก xargsคำเตือนเกี่ยวกับมาตรฐานช่องว่างในชื่อไฟล์นำไปใช้กับ
Barton Chittenden

2
สิ่งนี้จะมีลักษณะอย่างไร ฉันลืมxargsไวยากรณ์เสมอ
Brian Peterson

3
@BrianPeterson มันจะเป็นแบบนั้น:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

ต้องการค้นหาในทุกไดเรกทอรีย่อย แต่เฉพาะในประเภทไฟล์ที่ระบุ--includeให้ใช้กับ grep

ตัวอย่างเช่นการค้นหาแบบวนซ้ำในไดเรกทอรีปัจจุบันสำหรับข้อความใน * .yml และ * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}

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