Bagaimana saya bisa menggunakan grep untuk hanya menampilkan nama file di Linux?

1068

Bagaimana saya bisa menggunakan grep hanya untuk menunjukkan nama file (tidak ada kecocokan in-line) di Linux?

Saya biasanya menggunakan sesuatu seperti:

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

Bagaimana saya bisa mendapatkan nama file (dengan path), tetapi tanpa kecocokan? Apakah saya harus menggunakan xargs? Saya tidak melihat cara untuk melakukan ini di grephalaman manual saya .

cwd
sumber
3
Maksud Anda, Anda ingin nama file yang memiliki setidaknya satu kecocokan?
leonbloy
4
Pertanyaan yang bagus Saya sebenarnya mulai menggunakan ini untuk membuka daftar file yang dikembalikan oleh grep di Vim. vim $(grep -rl Something app/)
David Tuite
1
Anda tidak dapat membuat daftar file menggunakan perintah grep, ini pada dasarnya digunakan untuk mengambil teks yang diinginkan dari file atau daftar. Misalnya, ps aux | grep 'apt-get' atau grep 'text-to-find' / path / to / file /
iamjayp

Jawaban:

1625

Opsi standar grep -l(yaitu huruf kecil L) dapat melakukan ini.

Dari standar 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.

Anda juga tidak perlu -Hdalam hal ini.

Random832
sumber
37
Dokumentasi opsi ini (seperti sering dalam kebanyakan file man) jadi tidak jelas! Pfff ... Luar biasa bagaimana pria bisa menjadi sakit di pantat.
MonsieurDart
1
-H juga menunjukkan pertandingan itu sendiri. Pertanyaannya hanya untuk nama file.
Hauke
@ Hauke ​​Dan jawaban saya adalah -l. Saya sebutkan -H hanya karena perintah pengguna dalam pertanyaan termasuk -H dan itu berlebihan ketika -l diberikan.
Random832
2
Bagus, saya pribadi suka menggunakan ini dengan flag lain grep -nrl "some text" .ketika mencari teks dalam satu set subfolder secara rekursif
openwonk
142

Dari grep(1)halaman manual:

  -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.)
Ignacio Vazquez-Abrams
sumber
4
Berhenti pada pertandingan pertama adalah penting dan alami.
Thomson
7
dokumentasi membuatnya agak tidak jelas. "Pemindaian akan berhenti pada kecocokan pertama" - menunjukkan bahwa semua nama file akan dicetak, tetapi pemindaian untuk kata yang cocok akan berhenti pada kemunculan pertama.
TheMonkWhoSoldHisCode
2
@ VishalP: Karena kami tidak peduli di mana kemunculannya, hanya saja ada, tidak ada gunanya mencari setiap file di luar kemunculan pertama.
Ignacio Vazquez-Abrams
17
@ IgnacioVazquez-Abrams Tepat. Kesan pertama dokumen membuat Anda merasa hanya akan mencetak nama file dari file pertama. Anda benar-benar membutuhkan beberapa bacaan untuk memahaminya.
TheMonkWhoSoldHisCode
5
'Pemindaian file saat ini akan berhenti pada pertandingan pertama.' akan jauh lebih jelas.
sorrymissjackson
37

Untuk pencarian file sederhana, Anda dapat menggunakan grep -ldan -ropsi:

grep -rl "mystring"

Semua pencarian dilakukan dengan grep. Tentu saja, jika Anda perlu memilih file pada beberapa parameter lain, temukan adalah solusi yang benar:

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

The execdirpilihan membangun setiap perintah grep per setiap direktori, dan merangkai nama file menjadi hanya satu perintah ( +).

Manusia Timah
sumber
0

Pertanyaan Anda Bagaimana saya bisa mendapatkan nama-file saja (dengan path)

Contoh sintaks Anda ditemukan. -iname "* php" -exec grep -H myString {} \;

Saran perintah saya

sudo find /home -name *.php

Output dari perintah ini di OS Linux saya:

compose-sample-3 / html / mail / contact_me.php

Saat Anda membutuhkan nama file dengan path, selamat menikmati!

apl
sumber
Pertanyaannya secara khusus menanyakan bagaimana mereka mendapatkan nama file menggunakan grep .
snakecharmerb