การค้นหาไฟล์ที่มีสตริงที่แน่นอนโดยใช้ find (1) และ grep (1)


70

find . -type f -print -exec cat {} \; | grep some string

คำสั่งด้านบนไม่พิมพ์เส้นทางของไฟล์

ฉันกำลังใช้: Ubuntu, bash 4.


อาจไม่เป็นไปตามผลลัพธ์ที่คุณคาดไว้เนื่องจากตัวกรอง grep เกี่ยวกับสิ่งนี้:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex

เป้าหมายที่คุณต้องการบรรลุคืออะไร? ในเอาต์พุตที่คุณได้รับสาย grepped จากไฟล์คุณต้องการเส้นทางของไฟล์เหล่านั้นหรือไม่
mirkobrankovic

ใช่ฉันต้องการพิมพ์พา ธ ของไฟล์ที่มีสตริง 'some string' คำแนะนำ @artistoex จะพิมพ์พา ธ ของไฟล์ทั้งหมด
H.Rabiee

คุณอาจต้องการใช้ackเพื่อ grep ผ่านไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบันอาจกรองในไฟล์บางประเภทเท่านั้น
Jaap Eldering

คำตอบ:


87

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

find . -type f -print | xargs grep "some string"

เนื่องจากคุณมี GNU find / xargs นี่เป็นวิธีที่ปลอดภัยกว่าสำหรับ xargs ในการอ่านชื่อไฟล์:

find . -type f -print0 | xargs -0 grep "some string"

หากคุณต้องการชื่อไฟล์ที่มีบรรทัดที่ตรงกันเท่านั้นโดยไม่แสดงบรรทัดที่ตรงกัน:

find . -type f -print0 | xargs -0 grep -l "some string"

ฉันจะรวมคำสั่งด้านบนเข้ากับการค้นหาและแทนที่ได้อย่างไร เช่นเดียวกับใน grep แล้ว sed?
CMCDragonkai

1
find | grep ไปป์ไลน์ส่งออกชื่อไฟล์ดังนั้น:sed '...' $(find ... | xargs grep -l ...)
glenn jackman

107

ฉันใช้

grep "some string" . -R

และทำงานได้เร็วขึ้น

PS

กรณีการใช้งานที่ซับซ้อนมากขึ้น

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

อ่านคำอธิบายพารามิเตอร์

grep --help | grep -- -i

17
และ-nถ้าคุณต้องการหมายเลขบรรทัด +1 สำหรับคำตอบที่ง่ายขึ้น
แช้ด Skeeters

@ChadSkeeters อย่างแน่นอน การใช้การค้นหาไม่ได้ให้โซลูชันดังกล่าว
ArcherGodson

1
ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้องเพื่อความซื่อสัตย์ หนึ่งที่เลือกในปัจจุบันมีรายละเอียดอย่างอื่นอย่างสิ้นเชิง

11

ฉันมักจะค้นหาซอร์สโค้ดในโครงสร้างโฟลเดอร์ที่ซับซ้อนและฉันพบว่ามีประโยชน์โดยใช้:

cd /your/folder/
grep -rHino "your string"

กับพารามิเตอร์เหล่านั้นโดยไม่ต้องใช้หาผมขอรับแฟ้มเส้นทางแบบเต็มและหมายเลขบรรทัดที่มีสตริงที่ระบุ

นอกจากนี้ยังง่ายต่อการจำเพราะมันทุบตีผ่านการค้นหาของคุณเช่นrHino :)

ฉันจะแสดงวิธีการทำงานกับตัวอย่างด่วน

มาแสดงเนื้อหาของไฟล์โดยใช้ cat:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

และลองค้นหาไฟล์ทั้งหมดที่มีสตริง "iptables -P" แบบวนซ้ำ:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

ดังที่คุณเห็นในผลลัพธ์เรามีชื่อไฟล์: hit row: สืบค้นสตริง

นี่คือคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับพารามิเตอร์ที่ใช้:

-rสำหรับแต่ละตัวถูกดำเนินการไดเรกทอรีอ่านและประมวลผลไฟล์ทั้งหมดในไดเรกทอรีนั้นซ้ำ ติดตามลิงก์สัญลักษณ์ในบรรทัดคำสั่ง แต่ข้าม symlink ที่พบซ้ำ โปรดทราบว่าหากไม่มีการให้ไฟล์ถูกดำเนินการ grep จะค้นหาไดเรกทอรีทำงาน นี่เป็นเช่นเดียวกับตัวเลือก '--directories = recurse'

-iพิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง นี่คือค่าเริ่มต้นเมื่อมีมากกว่าหนึ่งไฟล์ที่จะค้นหา

-nคำนำหน้าแต่ละบรรทัดของเอาต์พุตด้วยหมายเลขบรรทัด 1-based ภายในไฟล์อินพุต (-n ถูกระบุโดย POSIX)

-Hพิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง นี่คือค่าเริ่มต้นเมื่อมีมากกว่าหนึ่งไฟล์ที่จะค้นหา

-oพิมพ์เฉพาะส่วนที่จับคู่ (ไม่ว่างเปล่า) ของบรรทัดที่ตรงกันโดยแต่ละส่วนดังกล่าวจะอยู่ในบรรทัดเอาต์พุตแยกต่างหาก บรรทัดเอาต์พุตใช้ตัวคั่นเดียวกับอินพุตและตัวคั่นเป็นไบต์ว่างถ้าใช้ -z (--null-data) (ดูตัวเลือกอื่น ๆ )


1

ฉันชอบ

| ค้นหาไฟล์ | ทำ grep ont หาไฟล์ | แสดงเส้นทางแบบเต็มของไฟล์

ค้นหา / -type f -exec grep 'บางสตริง' {} \; -exec echo {} \;


0

Silver Searcherเป็นเครื่องมือที่รวดเร็วและสะดวกในการค้นหาไฟล์และเนื้อหา

เพื่อแก้ปัญหาของคุณคำสั่ง silver searcher จะมีลักษณะเช่นนี้ ...

ag 'some string' -l

-l พิมพ์ชื่อไฟล์ที่มีการจับคู่เท่านั้น (อย่าพิมพ์บรรทัดที่ตรงกัน)

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