จำนวนไฟล์ที่มีสตริงที่กำหนด


19

ฉันจะนับจำนวนไฟล์ (ในไดเรกทอรี) ที่มีสตริงที่กำหนดเป็นอินพุตใน bash / sh ได้อย่างไร?

คำตอบ:


30

grep -l "string" * | wc -l จะค้นหาคำว่า "string" ในเนื้อหาของไฟล์ทั้งหมดในไดเร็คทอรี่สำหรับใช้ทำงานและบอกคุณว่ามีจำนวนเท่ากัน


1
สิ่งนี้จะไม่ทำงานหากมีไฟล์จำนวนมากในไดเรกทอรีมันจะโยนข้อผิดพลาด "zsh: รายการอาร์กิวเมนต์ยาวเกินไป: grep" มีความคิดเห็นเกี่ยวกับวิธีกำจัดสิ่งนี้อย่างไร

1
@ user16142 grep ไดเรกทอรีแทนไฟล์: grep -lr "string" directory | wc -lหากคุณไม่ต้องการการค้นหาแบบเรียกซ้ำคุณสามารถใช้ find ด้วยตัวเลือก maxdepth: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lโปรดทราบว่าตัวเลือกที่สองนี้ช้ากว่า grep
Agargara

9

grepพารามิเตอร์ s -lจะส่งออกชื่อไฟล์ที่มีการจับคู่$PATTERNเท่านั้นที่wcสามารถนับได้ในภายหลัง

grep -l "$PATTERN" * | wc -l

ขอบคุณ แต่สงสัยด้วยลวดลายในไฟล์ ... ขออภัยสำหรับคำถามที่คลุมเครือ

ถ้าเป็นเช่นนั้นใช้คำตอบของหมาป่า
กระดิก

3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

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


แต่มีบางอย่างหายไป? เพราะมันใช้งานไม่ได้

หากคุณมองหาสตริงเป็ดคุณต้องเขียนเหมือน / duck / ใน Awk คุณกำลังทำอย่างนั้น?
ม.ค. Persson

ใช่ผลลัพธ์: awk: อ่านข้อผิดพลาด (เป็นไดเรกทอรี)

คำตอบของ Wolf จะทำให้คุณซ้ำซ้อน หากมีเหตุการณ์ที่เกิดขึ้นหลายครั้งของสตริงที่คุณค้นหาในไฟล์ใดไฟล์หนึ่งมันจะนับเป็นการจับคู่แบบพิเศษ
ม.ค. Persson

ดีถ้าคุณมีไดเรกทอรีในโฟลเดอร์คุณต้องทำสิ่งพิเศษบางอย่างเช่นการแทนที่ดาวด้วยสิ่งนี้find . ! -name . -prune -type f(อย่าพลาด backticks) คำสั่งนี้แสดงรายการไฟล์ในโฟลเดอร์เท่านั้น
Jan Persson

2

สิ่งนี้ใช้ได้ใน Bash กับชื่อไฟล์ใด ๆ :

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

คำอธิบาย:

  • grep's -Zตัวเลือกพิมพ์ผลกับทุก␀ไบต์คั่น อักขระนี้ไม่สามารถเป็นส่วนหนึ่งของชื่อไฟล์ได้ดังนั้นเราสามารถนับจำนวนตัวคั่นเพื่อรับจำนวนไฟล์
  • ในการกำจัดตัวละครอื่น ๆ ในผลลัพธ์เราเพียงแค่ลบทุกอย่างยกเว้น everything ไบต์ที่ใช้tr ␀ไบท์โดยใช้
  • wcแล้วก็นับตัวละครด้วย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.