ค้นหาข้อความซ้ำด้วย grep และรูปแบบไฟล์


46

รับโครงสร้างโฟลเดอร์ตัวอย่างนี้:

/folder1/file1.txt
/folder1/file2.djd
/folder2/file3.txt
/folder2/file2.fha

ฉันจะค้นหาข้อความแบบเรียกซ้ำใน*.txtไฟล์ทั้งหมดด้วยgrep"/" ได้อย่างไร

( "grep -r <pattern> *.txt"ล้มเหลวเมื่อเรียกใช้จาก "/" เนื่องจากไม่มี.txtไฟล์ในโฟลเดอร์นั้น)

คำตอบ:


61

GNU Grep รุ่นของฉันมีสวิตช์สำหรับสิ่งนี้:

grep -R --include='*.txt' $Pattern

อธิบายไว้ดังนี้:

--include=GLOB

ค้นหาเฉพาะไฟล์ที่มีชื่อฐานตรงกับ GLOB (ใช้การจับคู่ไวด์การ์ดตามที่อธิบายไว้ใน --exclude)


19

หากคุณมีไฟล์จำนวนมากจะเป็นประโยชน์ในการรวม xargs ไว้ในคำสั่งเพื่อหลีกเลี่ยงข้อผิดพลาด 'รายการอาร์กิวเมนต์ที่ยาวเกินไป'

find . -name '*.txt' -print | xargs grep <pattern>

6
หากมีช่องว่างในชื่อไฟล์หรือไดเรกทอรีใด ๆ ให้ใช้แบบฟอร์มนี้: ค้นหา -name '* .txt' -print0 | xargs -0 grep <รูปแบบ>
Jason Luther

2
-และแน่นอนมีปัญหาของชื่อไฟล์ที่ขึ้นต้นด้วย
TJ Crowder

grepfindเป็นได้เร็วขึ้น
Nabi KAZ



0
find . -name '*.txt' -type f -exec grep <pattern> {} \;

คุณอาจต้องการใช้ "find. -name '* .txt' -type f -exec grep <pattern> {} +" แทนเพื่อให้มันทำงานคล้ายกับการตรวจสอบจาก Mark Robinson - ทำงานกับ GNU เท่านั้นที่รู้ถึงความรู้ของฉัน
serverhorror

0

คำตอบของ Mannis จะแยกกระบวนการ grep ใหม่สำหรับทุกเท็กซ์ไฟล์ หากคุณมีไฟล์ข้อความจำนวนมากคุณอาจลองทำการ grepping ทุกไฟล์ก่อนและเลือกไฟล์. txt เมื่อทำเสร็จแล้ว:

grep -r <pattern> * | grep \.txt:

นั่นเป็นดิสก์ที่มีความเข้มข้นมากกว่า แต่อาจเร็วกว่าอยู่ดี


0

มันเป็นปี 2019 และไม่มีทางที่ฉันจะยังคงใช้ grep สำหรับการค้นหาข้อความแบบเรียกซ้ำ

คำตอบในปัจจุบันของ IMHO ควรมีripgrep :

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