Bagaimana saya bisa secara grep mengambil file tertentu dalam direktori?

14

Saya baru mengenal linux dan grep, dan mencoba menemukan jalan saya.

Dengan menggunakan find -name *.javasaya dapat menemukan nama-nama semua file java di direktori tertentu. Misalkan saya ingin menghitung berapa kali footerjadi dalam file-file ini, bagaimana saya melakukannya?

Saya sudah mencoba hal-hal seperti:

grep -r "foo" *.java

dan mendapatkan respons seperti:

grep:  *.java:  No such file or directory

Ada ide?

Eric Wilson
sumber
1
Maaf, aku akan terlihat lebih keras lain kali. Luar biasa bahwa pertanyaannya sangat mirip.
Eric Wilson
1
Judul 3512 bisa jadi jauh lebih baik. "Pertanyaan penggunaan grep dasar" tidak banyak memberi tahu Anda tentang pertanyaan yang sebenarnya. Kami mungkin memiliki lebih banyak dupes kecuali jika itu diperbaiki.
Richard Hoskins
1
@ Richardhoskins, diperbaiki.
John T

Jawaban:

16
find . -name '*.java' | xargs grep <your pattern here>
arathorn
sumber
5
Lebih baik lagi, gunakan item yang dihentikan nol sehingga nama file dengan spasi di dalamnya tidak dapat dibagi menjadi dua nama file: find. -nama '* .java' -type f -print0 | xargs -0 grep <your pattern here>
CoverosGene
1
@CoverosGene: Anda dapat menggunakan opsi --replace ke xargs untuk mengatasinya - seperti ini: ... | xargs --replace grep "{}" <pattern>
arathorn
terima kasih banyak, saya tahu pasti ada perintah yang melakukan apa yang xargsbisa.
Eric Wilson
6

Ada alat yang dirancang khusus untuk jenis kebutuhan ini: ack .

ack adalah alat seperti grep, yang ditujukan untuk pemrogram dengan pohon besar kode sumber yang heterogen

Baca juga "10 alasan teratas untuk menggunakan ack alih-alih grep." di halaman ack .

pengguna4126
sumber
1
Ah. Alat unix nyata membutuhkan nama rekursif yang merujuk pada warisannya ... seperti abtg [ABTG's Better Than Grep], atau sesuatu. ACK? Berpikir hanya baik tentang itu adalah bahwa penulis ditingkatkan NACK sudah nama memilih;)
Mikeage
Salah satu alasan saya sangat suka ack adalah Anda dapat menentukan jenis file. Misalnya, saya dengan "ack --html <pattern>" itu mencari semua file .html, .htm, .xhtml, .dhtml, dll. Saya sekaligus.
Mark van Lent
Ack telah cukup banyak menggantikan grep untuk saya.
Ryan C. Thompson
3

Bagaimana dengan:

grep -irn --include="*\.java" somePhrase *
Manatok
sumber
0

Temukan . -type f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l

wudeng
sumber
3
Selamat datang di SuperUser! Anda akan menemukan bahwa jawaban Anda mendapat lebih banyak perhatian ketika itu untuk pertanyaan yang lebih baru (yang ini berasal dari 2009) dan ketika Anda menjelaskan mengapa jawaban Anda lebih baik daripada yang sudah diterima.
Eric Wilson