Anda juga bisa menggunakan globstar.
Membangun grep
perintah dengan find
, seperti dalam jawaban Zanna , adalah cara yang sangat kuat, fleksibel, dan portabel untuk melakukan ini (lihat juga jawaban sudodus ). Dan Muru telah diposting sebuah pendekatan yang sangat baik dari menggunakan grep
's --include
pilihan . Tetapi jika Anda hanya ingin menggunakan grep
perintah dan shell Anda, ada cara lain untuk melakukannya - Anda dapat membuat shell itu sendiri melakukan rekursi yang diperlukan :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
The -H
merek Bendera grep
menunjukkan nama file bahkan jika hanya satu file yang cocok ditemukan. Anda dapat melewati -a
, -i
dan -n
bendera (dari contoh Anda) untuk grep
juga, jika itu yang Anda butuhkan. Tetapi jangan lulus -r
atau -R
saat menggunakan metode ini. Ini adalah shell yang mengulang direktori dalam memperluas pola glob yang mengandung **
, dan tidakgrep
.
Instruksi ini khusus untuk Bash shell. Bash adalah shell pengguna default di Ubuntu (dan sebagian besar sistem operasi GNU / Linux) lainnya, jadi jika Anda menggunakan Ubuntu dan tidak tahu apa shell Anda, itu hampir pasti Bash. Meskipun cangkang populer biasanya mendukung **
gumpalan direktori- traverse, mereka tidak selalu bekerja dengan cara yang sama. Untuk informasi lebih lanjut, lihat Stéphane Chazelas 's jawaban yang sangat baik untuk Hasil ls *, ls ** dan ls *** di Unix.SE .
Bagaimana itu bekerja
Mengaktifkan opsi bash shell globstar membuat jalur yang cocok berisi pemisah direktori ( ). Dengan demikian, ini adalah glob yang berulang direktori. Secara khusus, seperti yang dijelaskan:**
/
man bash
Ketika opsi shell globstar diaktifkan, dan * digunakan dalam konteks ekspansi pathname, dua * berdekatan yang digunakan sebagai pola tunggal akan cocok dengan semua file dan nol atau lebih direktori dan subdirektori. Jika diikuti oleh a /, dua * yang berdekatan hanya akan cocok dengan direktori dan subdirektori.
Anda harus berhati-hati dengan ini, karena Anda dapat menjalankan perintah yang mengubah atau menghapus lebih banyak file daripada yang Anda inginkan, terutama jika Anda menulis **
ketika Anda ingin menulis *
. (Aman dalam perintah ini, yang tidak mengubah iles.) shopt -u globstar
Mematikan opsi shell globstar.
Ada beberapa perbedaan praktis antara globstar dan find
.
find
jauh lebih fleksibel daripada globstar. Apa pun yang dapat Anda lakukan dengan globstar, Anda dapat melakukannya dengan find
perintah juga. Saya suka globstar, dan kadang lebih nyaman, tetapi globstar bukan alternatif umumfind
.
Metode di atas tidak melihat ke dalam direktori yang namanya dimulai dengan a .
. Terkadang Anda tidak ingin mengulang folder seperti itu, tetapi terkadang Anda melakukannya.
Seperti halnya bola biasa, shell membuat daftar semua jalur yang cocok dan meneruskannya sebagai argumen untuk perintah Anda ( grep
) sebagai ganti bola itu sendiri. Jika Anda memiliki begitu banyak file yang dipanggil file.txt
sehingga perintah yang dihasilkan akan terlalu lama untuk dieksekusi oleh sistem, maka metode di atas akan gagal. Dalam praktiknya Anda akan membutuhkan (setidaknya) ribuan file seperti itu, tetapi itu bisa terjadi.
Metode yang digunakan find
tidak tunduk pada batasan ini, karena:
Cara Zanna membangun dan menjalankan grep
perintah dengan argumen jalur yang berpotensi banyak. Tetapi jika lebih banyak file ditemukan daripada yang bisa didaftarkan dalam satu jalur, tindakan +
-minminasi -exec
menjalankan perintah dengan beberapa jalur, kemudian jalankan lagi dengan beberapa jalur lagi, dan sebagainya. Dalam hal grep
mencari string dalam banyak file, ini menghasilkan perilaku yang benar.
Seperti metode globstar yang dicakup di sini, ini mencetak semua garis yang cocok, dengan jalur yang masing-masingnya berurutan.
cara sudodus berjalan grep
secara terpisah untuk setiap file.txt
ditemukan. Jika ada banyak file, mungkin lebih lambat dari beberapa metode lain, tetapi berhasil.
Metode itu menemukan file dan mencetak jalurnya, diikuti oleh garis yang cocok jika ada. Ini adalah format output yang berbeda dari format yang dihasilkan oleh metode saya, Zanna , dan muru .
Mendapatkan warna dengan find
Salah satu manfaat langsung dari menggunakan globstar adalah, secara default di Ubuntu, grep
akan menghasilkan keluaran berwarna. Tapi Anda dapat dengan mudah mendapatkan ini dengan find
juga .
Akun pengguna di Ubuntu dibuat dengan alias yang menjadikannya grep
benar-benar berjalan grep --color=auto
(run alias grep
to see). Ini hal yang baik yang alias cukup banyak hanya diperluas ketika Anda mengeluarkan mereka secara interaktif , tetapi itu berarti bahwa jika Anda ingin find
untuk memohon grep
dengan --color
bendera, Anda harus menulis secara eksplisit. Sebagai contoh:
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +