Grep rekursif gagal untuk file * .c

13

Saya mencoba secara rekursif mencari pola di semua file .c dengan cara berikut

> grep -lr search-pattern *.c

Tapi dapatkan ini sebagai output

> grep: *.c: No such file or directory

Ketika saya menggunakan ini:

> grep -lr search-pattern *

Saya mendapat banyak. file c dalam direktori dengan pola.

Apa yang salah dengan ungkapan sebelumnya?

Jay
sumber

Jawaban:

22

Saya sarankan untuk menggunakan --includeopsi grep:

grep -lr --include='*.c' search-pattern .
enzotib
sumber
1
+1. Saya tidak tahu --include=GLOBpilihannya. Dalam kombinasi dengan opsi rekursif ini sangat kuat dan tidak memerlukan find. Bagus!
gertvdijk
Terlambat ke pesta di sini, tapi aku bingung untuk apa .di akhir perintah.
Nathan Jones
1
@NathanJones: grep memerlukan satu atau lebih nama file atau direktori tempat pencarian. Titik mengatakan: cari di direktori saat ini
enzotib
3

The *.cpola dievaluasi oleh shell Anda. Ini berlaku untuk direktori saat ini, sama seperti yang Anda gunakan ls *.c.

Saya pikir yang Anda inginkan adalah menemukan semua file yang cocok dengan *.cpola (secara rekursif) dan grepmencari Anda di dalamnya. Inilah cara untuk melakukan itu:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Ini digunakan xargsuntuk menambahkan hasil pencarian oleh find.


Atau, gunakan -execopsi untuk menemukan, misalnya:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

Juga, saya tidak yakin apakah Anda benar-benar menginginkan -lopsi itu grep. Itu akan berhenti pada pertandingan pertama:

-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.)
gertvdijk
sumber
The find/xargssintaks istirahat pada nama file yang mengandung spasi. The -Lpilihan untuk grepberhenti di pertandingan pertama setiap file dan lanjutkan dengan file selanjutnya: jika salah satu hanya ingin melihat apakah pola terkandung setidaknya sekali dalam setiap file yang diberikan, itu lebih cepat.
enzotib
@enzotib Terima kasih, perbaiki menggunakan -print0opsi dan xargs --null.
gertvdijk
-1

Saya tahu ini adalah utas yang agak lama, tetapi karena saya memiliki pertanyaan yang sama, saya ingin berbagi cara yang saya sukai untuk mencapai hal yang sama, Dalam bentuk yang jauh lebih pendek.

ls | grep "file.*.c"
Jebiel
sumber
2
Pertanyaannya adalah tentang mencari pola, bukan tentang mencari file.
Jay