วิธีคืนทั้งชื่อไฟล์และหมายเลขบรรทัดด้วย find … -exec grep


45

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

ชื่อไฟล์: find . -type f -exec grep -l 'string to search' {} \;

หมายเลขบรรทัด: find . -type f -exec grep -n 'string to search' {} \;

คำตอบ:


51

สวิตช์บรรทัดคำสั่ง-Hบังคับgrepให้พิมพ์ชื่อไฟล์แม้จะมีเพียงไฟล์เดียว

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

โปรดทราบว่าตามที่Kojiroพูดในความคิดเห็นนี่ไม่ใช่ส่วนหนึ่งของมาตรฐาน POSIX มันมีทั้ง grep GNU และ BSD แต่เป็นไปได้ที่ระบบบางระบบอาจไม่มี (เช่น Solaris)


4
คำตอบนี้สามารถปรับปรุงได้โดยชี้ให้เห็นว่าการ-Hตั้งค่าสถานะเพื่อgrepเป็นส่วนขยาย GNU ที่ไม่เป็นมาตรฐานและวางแนวทางอื่นสำหรับระบบที่ไม่ใช่ GNU
kojiro

22
find . -type f -exec grep -n 'string to search' /dev/null {} +

(หรือ grep GNU ดู-Hตัวเลือก)


ทั้ง + และ -H ทำงานได้ดีมากขอบคุณ!
Danny_Joris

และเกี่ยวข้องกับคำตอบนี้: unix.stackexchange.com/questions/3682/…
Danny_Joris

4
+1 ถูกต้องเนื่องจากการทำให้grepมีชื่อไฟล์หลายรายการจะบังคับให้ส่งออกชื่อไฟล์ที่ตรงกัน ฉลาด!
kojiro

-1

หาก grep ของคุณรองรับการ-rตั้งค่าสถานะแบบเรียกซ้ำสิ่งนี้จะแก้ไขคำขอของคุณ:

grep -rn "String to search " * 

1
เป็นเรื่องจริง แต่ฉันไม่เห็นว่าสิ่งนี้จะเพิ่มคำตอบที่มีอยู่
Wildcard

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