Untuk mencari string literal di file teks dalam sebuah direktori beserta subdirektorinya, gunakan:
grep -rInF -- 'teks yang dicari' ./proyek/Ganti string dan direktori dengan target Anda. -r menelusuri subdirektori, -I melewati file yang dianggap biner, -n menampilkan nomor baris, dan -F memperlakukan pola sebagai teks literal, bukan regular expression. Pemisah -- mengakhiri opsi, sehingga pola yang diawali tanda minus tidak dianggap sebagai flag.
Batas cakupan: “semua file” di sini berarti file yang dapat dibaca dalam direktori pilihan, bukan seluruh komputer. Dengan -I, file biner sengaja tidak dicari. Jangan mulai dari / atau memakai sudo hanya untuk menghilangkan error akses; batasi ke folder yang memang Anda berhak baca.
Prasyarat dan batas versi
Contoh ditujukan untuk Bash dan GNU grep. Periksa implementasi Anda:
| Flag | Fungsi |
|---|---|
-r |
Telusuri semua subfolder secara rekursif |
-l |
Tampilkan nama file saja, bukan barisnya |
-n |
Sertakan nomor baris hasil |
-i |
Abaikan perbedaan besar-kecil huruf |
--include='*.js' |
Batasi pencarian ke pola file tertentu |
--exclude-dir=node_modules |
Lewati folder yang tidak relevan |
grep --versionOpsi panjang seperti --exclude-dir tidak dijamin sama pada semua implementasi. macOS umumnya menyediakan BSD grep; baca man grep setempat atau gunakan GNU grep jika mengikuti contoh GNU secara persis.
Latihan dalam folder sementara
Blok berikut membuat fixture baru, tidak mengubah source proyek. Jalankan urut dalam sesi Bash yang sama. Simpan nilai lab jika ingin meninjau file sesudah latihan; folder tidak dihapus otomatis.
lab=$(mktemp -d)
mkdir -p "$lab/proyek/src" "$lab/proyek/.git" "$lab/proyek/node_modules"
printf 'TODO awal\nconsole.log("a"); console.log("b");\ntodo kecil\n' > "$lab/proyek/src/app.js"
printf 'TODO tersembunyi\n' > "$lab/proyek/.catatan"
printf 'TODO dependensi\n' > "$lab/proyek/node_modules/vendor.js"
printf 'TODO internal\n' > "$lab/proyek/.git/catatan"
printf 'consoleXlog\n' > "$lab/proyek/src/lain.js"
printf 'TODO\0biner\n' > "$lab/proyek/data.bin"
printf '%s\n' '-opsi' > "$lab/proyek/src/opsi.txt"
cd "$lab" || exit 1Rekursif, termasuk file tersembunyi
grep -rInF -- 'TODO' ./proyek/Hasilnya berformat nama-file:nomor-baris:isi. Urutan antarfile tidak dijamin. Pada fixture ini, hasil mencakup empat file teks, termasuk .catatan, .git/catatan, dan node_modules/vendor.js; data.bin dilewati karena -I.
Menggunakan direktori ./proyek/ membuat grep menelusuri file tersembunyi juga. Sebaliknya, wildcard shell ./proyek/* biasanya tidak menyertakan entri tersembunyi pada level awal. GNU grep -r tidak mengikuti symlink yang ditemukan selama penelusuran, tetapi mengikuti symlink yang diberikan langsung sebagai argumen. -R mengikuti semua symlink; jangan menggantinya tanpa memahami cakupan tambahan dan potensi loop.
Batasi ekstensi dan kecualikan direktori
grep -rInF --include='*.js' --exclude-dir=node_modules --exclude-dir=.git -- 'TODO' ./proyek/Output fixture:
./proyek/src/app.js:1:TODO awalSemua opsi ditulis sebelum -- dan operand. Kutip '*.js' agar pola ekstensi diterima grep, bukan lebih dahulu diperluas oleh shell. Untuk mengecualikan file tertentu, tambahkan opsi seperti --exclude='*.min.js' sebelum --.
Abaikan kapitalisasi atau tampilkan nama file saja
grep -rInFi --include='*.js' --exclude-dir=node_modules -- 'todo' ./proyek/Output fixture:
./proyek/src/app.js:1:TODO awal
./proyek/src/app.js:3:todo kecil
grep -rIlF -- 'console.log' ./proyek/Opsi -l hanya mencetak nama file yang cocok: ./proyek/src/app.js. consoleXlog tidak cocok karena -F membuat titik menjadi literal. Tanpa -F, titik pada regex berarti satu karakter apa pun.
Menghitung baris, bukan jumlah kemunculan
grep -cF -- 'console.log' ./proyek/src/app.jsOutput fixture adalah 1, bukan 2, meskipun baris kedua memuat dua console.log. -c menghitung baris yang cocok. Untuk menghitung setiap kemunculan yang tidak tumpang tindih pada satu file ini:
grep -oF -- 'console.log' ./proyek/src/app.js | wc -lHasilnya 2 (spasi padding dari wc bisa berbeda). Dalam skrip yang perlu membedakan error grep dari hasil hitungan, periksa status tiap tahap pipeline; status wc saja tidak membuktikan grep berhasil.
Pola dengan tanda minus
grep -nF -- '-opsi' ./proyek/src/opsi.txtOutputnya 1:-opsi. Tanda kutip menjaga pola tetap satu argumen; -- mencegah interpretasi pola sebagai opsi.
File biner dan error akses
Default GNU grep adalah --binary-files=binary: ketika input dianggap biner dan ada kecocokan, grep dapat menampilkan pesan Binary file ... matches, bukan baris isinya. -I setara dengan --binary-files=without-match, bukan perilaku default. Opsi -a memperlakukan input sebagai teks; jangan gunakan sembarangan karena byte kontrol dari file biner dapat mengacaukan terminal.
Untuk Permission denied, periksa pemilik/izin dan pilih direktori yang dapat dibaca. Membuang stderr dengan 2>/dev/null hanya menyembunyikan pesan; itu tidak memperbaiki izin dan tidak membuktikan pencarian lengkap. Jangan membagikan output yang berisi password, token, atau konfigurasi rahasia.
Exit status untuk skrip
GNU grep mengembalikan 0 jika ada kecocokan, 1 jika tidak ada kecocokan, dan 2 jika terjadi error. Hasil kosong bukan selalu kegagalan. Pengecualian penting: dengan -q, ditemukannya kecocokan dapat menghasilkan 0 walaupun ada error lain; jangan gunakan itu untuk audit kelengkapan.
grep -nF -- 'tidak-ada' ./proyek/src/app.js
status=$?
printf 'status=%s\n' "$status"Fixture menghasilkan status=1. Dalam skrip dengan set -e, tangani status 1 lewat if atau logika eksplisit agar “tidak ditemukan” tidak menghentikan skrip tanpa sengaja. Jangan otomatis menambahkan || true, karena error nyata ikut tersembunyi.
Ringkasan dan rujukan
Mulai dari direktori kecil, gunakan -F untuk string literal, dan pilih -I hanya jika memang ingin melewati biner. Persempit pencarian menggunakan --include/--exclude-dir, lalu periksa stderr dan exit status sebelum menyimpulkan tidak ada hasil.
Rujukan primer: GNU grep manual, terutama File and Directory Selection, Matching Control, General Output Control, dan Exit Status. Bantuan implementasi terpasang tersedia melalui grep --help.
Catatan verifikasi lokal: fixture diuji dengan GNU grep 3.0 dan Bash 5.2.37 dari Git for Windows memakai locale C.UTF-8, bukan kernel Linux atau BSD grep. Pada build Windows ini, percobaan -Fi dengan locale C mengalami crash; tes diulang dengan C.UTF-8. Itu temuan kompatibilitas build yang diuji, bukan perilaku normal GNU grep. Jika mengalami crash, periksa versi/locale dan perbarui implementasi, jangan menganggapnya hasil “tidak ditemukan”. Uji mencakup literal/regex, hidden file, filter, biner, hitungan, dan status 0/1/2. Penolakan izin Linux dan traversal symlink Linux belum diuji langsung. Contoh output di atas berasal dari fixture; ini bukan hasil pencarian server produksi.