grep - ชื่อรายการไฟล์ที่พบคู่ที่ตรงกัน


31

ฉันมีไฟล์. html มากมายในไดเรกทอรี ฉันต้องการดูแต่ละไฟล์และจับคู่รูปแบบ (MD5) ทั้งหมดนี้เป็นเรื่องง่ายพอ ปัญหาคือฉันต้องรู้ว่าไฟล์อะไรที่ตรงกับที่พบใน

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

ส่งกลับเฉพาะเนื้อหาของหน้า HTML ที่พบการจับคู่ แต่ไม่ได้บอกไฟล์ที่พบในนั้นฉันจะได้ grep เพื่อแสดงชื่อไฟล์ที่พบการจับคู่ของฉันได้อย่างไร


คำแนะนำที่ให้มาใช้งานไม่ได้จริงๆ .... สิ่งที่ฉันได้รับคือ 'อินพุตมาตรฐาน' cat * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (อินพุตมาตรฐาน): <html> <head> <head> <title>
BeMy Friend

4
คุณไม่มีจุด คุณไม่จำเป็นต้องใช้แมว cat ป้องกัน grep ไม่ให้แยกไฟล์แต่ละไฟล์
muru

คุณอาจพบว่ามีประโยชน์ในโพสต์Stack Overflow
Pablo A

คำตอบ:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
ตามที่ระบุไว้นั่นเป็นค่าเริ่มต้นสำหรับไฟล์หลายไฟล์ตราบใดที่มีไฟล์ html มากกว่าหนึ่งไฟล์-Hก็ไม่จำเป็น
muru

1
ขออภัยคำถามของฉันไม่เหมาะสม ฉันควรจะบอกว่าฉันได้ทำงานนี้มาระยะหนึ่งแล้วและฉันใช้สวิตช์จำนวนหนึ่งและได้อ่านหน้า MAN ที่มีการกล่าวว่าจะแสดงชื่อไฟล์ตามค่าเริ่มต้น .... แต่สิ่งที่ฉันได้รับคือ (อินพุตมาตรฐาน ) ตำแหน่งที่ควรแสดงรายการชื่อไฟล์
BeMy เพื่อน

และนั่นก็ต่อเมื่อฉันให้สวิตช์ -H ถ้าฉันทำเฉพาะสิ่งที่ฉันระบุไว้ใน OP ก็จะไม่มีชื่อไฟล์ใด ๆ
BeMy เพื่อน

3
@BeMyFriend catปัญหาคือ catหมายถึงการต่อกัน หากคุณ concatenate ไฟล์ทั้งหมด togheter ก่อนที่จะผ่านพวกเขาไปgrep, grepเห็นเพียงหนึ่งแฟ้มใส่ขนาดใหญ่ที่ได้มาตรฐานและไม่สามารถ (สั้น ๆ ของการทำดวงชะตา) ให้คุณสำรองข้อมูลใด ๆ เกี่ยวกับไฟล์เดียว ดู?. ไซรัสสิ่งที่เกี่ยวกับการอธิบายในคำตอบ?
Rmano

ตกลงปัญหาคือคำสั่ง cat แต่สิ่งที่สามารถแก้ไขได้?
Josef Klimuk

20

ฉันใช้อันนี้ตลอดเวลาเพื่อค้นหาไฟล์ที่มีสตริง RECURSIVELY ในไดเรกทอรี (นั่นหมายถึงการข้ามโฟลเดอร์ย่อยย่อยใด ๆ ) grep -Ril "yoursearchtermhere"

  • R คือการค้นหาแบบเรียกซ้ำ (ทำตามลิงก์)
  • i คือการทำให้มันไม่รู้สึกตัว
  • l เป็นเพียงการแสดงรายชื่อไฟล์

ดังนั้นการตอบคำถามของคุณ grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlจะทำ แต่คุณสามารถทำได้ grep -Ril '75447A831E943724DD2DE9959E72EE31'เพื่อค้นหาสตริงนั้นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ในไฟล์ใด ๆ ในโฟลเดอร์ย่อยใด ๆ


macOS ต้องการ def ไฟล์เสมออาจเป็น wildcard มิฉะนั้นจะถือว่าอินพุตจากstdin( grep: คำเตือน: การค้นหาแบบเรียกซ้ำของ stdinสิ่งที่อินพุต stdin แบบเรียกซ้ำจะหมายถึง :-) กล่าวอีกนัยหนึ่ง:grep -Ril 'texttofind' *
วิลล์

grep -RiH 'pattern'แสดงชื่อไฟล์และบรรทัดที่ตรงกัน
Ikrom


2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

ทางเลือกที่จะ

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

การดำเนินการด้านบนจะค้นหาแบบวนซ้ำในโฟลเดอร์และโฟลเดอร์ย่อยและพิมพ์เส้นทางของไฟล์ ...


grep -r -l เป็นสิ่งเดียวที่ทำงานกับฉัน
Josef Klimuk

0

คำตอบที่โพสต์โดย Cyrus นั้นเหมาะสมอย่างยิ่งและเป็น The Right Way TM ที่จะทำgrepหากเราต้องการค้นหาไฟล์เท่านั้น เมื่อชื่อไฟล์จำเป็นต้องมีการแยกวิเคราะห์เพิ่มเติมหรือการดำเนินการกับชื่อไฟล์ที่ตรงกันเราสามารถใช้การwhileวนซ้ำกับifคำสั่ง นี่คือตัวอย่างที่รายชื่อไฟล์มาจากโครงสร้างfind+ ที่ใช้กันอย่างแพร่หลายwhileเพื่อการแยกชื่อไฟล์อย่างปลอดภัย

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

1
ที่เกี่ยวข้อง: ค้นหารูปแบบ / ข้อความซ้ำ ๆ ในชื่อไฟล์ที่ระบุของไดเรกทอรีหรือไม่ โดยเฉพาะอย่างยิ่งMuru ของคำตอบที่แสดงให้เห็นถึงgrep's --includeธง
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.