ฉันจะใช้ grep เพื่อแสดงชื่อไฟล์บน Linux ได้อย่างไร


1068

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

ฉันมักจะใช้สิ่งที่ชอบ:

find . -iname "*php" -exec grep -H myString {} \;

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


3
คุณหมายถึงคุณต้องการชื่อไฟล์ที่มีการแข่งขันอย่างน้อยหนึ่งรายการใช่หรือไม่
leonbloy

4
เป็นคำถามที่ดีมาก ฉันเริ่มใช้สิ่งนี้เพื่อเปิดรายการไฟล์ที่ส่งคืนโดย grep ใน Vim vim $(grep -rl Something app/)
David Tuite

1
คุณไม่สามารถแสดงรายการไฟล์โดยใช้คำสั่ง grep โดยทั่วไปจะใช้เพื่อดึงข้อความที่ต้องการจากไฟล์หรือรายการ ตัวอย่างเช่น ps aux | grep 'apt-get' หรือ grep 'text-to-find' / path / to / file /
iamjayp

คำตอบ:


1625

ตัวเลือกมาตรฐานgrep -l(นั่นคือตัวพิมพ์เล็ก L) สามารถทำได้

จากมาตรฐาน Unix :

-l
    (The letter ell.) Write only the names of files containing selected
    lines to standard output. Pathnames are written once per file searched.
    If the standard input is searched, a pathname of (standard input) will
    be written, in the POSIX locale. In other locales, standard input may be
    replaced by something more appropriate in those locales.

คุณไม่จำเป็นต้องใช้-Hในกรณีนี้


37
เอกสารของตัวเลือกนี้คือ (บ่อยครั้งในไฟล์คนส่วนใหญ่) จึงไม่ชัดเจน! Pfff ... น่าอัศจรรย์ว่ามนุษย์สามารถเจ็บปวดในตูดได้อย่างไร
MonsieurDart

1
- เอชยังแสดงให้เห็นการแข่งขันของตัวเอง คำถามนี้เป็นเพียงชื่อไฟล์
Hauke

@Hauke ​​และคำตอบของฉันคือ -l ฉันพูดถึง -H เพียงเพราะคำสั่งของผู้ใช้ในคำถามรวม -H และมันซ้ำซ้อนเมื่อ -l จะได้รับ
Random832

2
นิสัยดีฉันชอบใช้สิ่งนี้กับธงอื่น ๆgrep -nrl "some text" .เมื่อค้นหาข้อความในโฟลเดอร์ย่อยซ้ำ ๆ ซ้ำ ๆ
openwonk

142

จากgrep(1)หน้าคน:

  -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

4
การหยุดที่คู่แรกเป็นสิ่งจำเป็นและเป็นไปตามธรรมชาติ
Thomson

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

2
@VishalP: เนื่องจากเราไม่สนใจว่ามีสิ่งที่เกิดขึ้นอยู่ที่ใดจึงไม่มีจุดในการค้นหาแต่ละไฟล์นอกเหนือจากที่เกิดขึ้นครั้งแรก
Ignacio Vazquez-Abrams

17
@ IgnacioVazquez-Abrams อย่างแน่นอน ความประทับใจแรกของเอกสารทำให้คุณรู้สึกว่ามันจะพิมพ์ชื่อไฟล์ของไฟล์แรกเท่านั้น คุณจำเป็นต้องอ่านสองสามครั้งเพื่อทำความเข้าใจ
TheMonkWhoSoldHisCode

5
'การสแกนไฟล์ปัจจุบันจะหยุดในนัดแรก' จะมีความชัดเจนมากขึ้น
Sorrymissjackson

37

สำหรับการค้นหาไฟล์อย่างง่ายคุณสามารถใช้ grep's -lและ-roptions:

grep -rl "mystring"

การค้นหาทั้งหมดทำโดย grep แน่นอนถ้าคุณต้องการเลือกไฟล์ในพารามิเตอร์อื่น ๆ find เป็นทางออกที่ถูกต้อง:

find . -iname "*.php" -execdir grep -l "mystring" {} +

execdirตัวเลือกสร้างแต่ละคำสั่ง grep ต่อแต่ละไดเรกทอรีและเชื่อมชื่อไฟล์ลงไปเพียงหนึ่งคำสั่ง ( +)


0

คำถามของคุณฉันจะได้รับชื่อไฟล์ (พร้อมเส้นทาง) ได้อย่างไร

ตัวอย่างไวยากรณ์ของคุณค้นหา - ชื่อ "* php" -exec grep -H myString {} \;

ข้อเสนอแนะคำสั่งของฉัน

sudo find /home -name *.php

ผลลัพธ์จากคำสั่งนี้บน Linux OS ของฉัน:

เขียนตัวอย่าง-3 / html / mail / contact_me.php

ตามที่คุณต้องการชื่อไฟล์พร้อมเส้นทางสนุกได้เลย!


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