Proyek yang tumbuh cepat punya ratusan file, dan kamu sering perlu mencari dua hal: file-nya di mana, dan baris mana yang menyebut sesuatu. Bayangin perpustakaan. Kalau kamu mencari buku dari judul di sampulnya, kamu pakai katalog: itu find, yang mencari dari nama file. Kalau kamu mencari halaman yang menyebut satu kata tertentu, kamu harus membuka isinya: itu grep, yang mencari teks di dalam file.
🧪 Tebakan cepat: di
logs/app.logada tiga baris berlabelERROR. Berapa baris yang dicetakgrep "error" logs/app.log? Tebak dulu, jawabannya ada di bagian "grep: cari teks di dalam file".
Contoh di bawah dijalankan di ~/proyek-web milik Budi: ada error.log, index.html, script.js, style.css, folder logs berisi app.log, dan folder src berisi main.js dan utils.js.
find: cari file berdasarkan nama
budi@laptop:~/proyek-web$ find . -name "*.log"
./error.log
./logs/app.log
budi@laptop:~/proyek-web$ find . -name "*.js"
./script.js
./src/main.js
./src/utils.js
budi@laptop:~/proyek-web$ find . -type d
.
./logs
./src
find .mulai dari folder sekarang (.) dan turun ke semua subfolder di dalamnya.-name "*.log"menyaring berdasarkan nama.*artinya "karakter apa saja, berapa pun", jadi*.logcocok dengan semua nama yang berakhiran.log. Tanpa*,-name "app"cuma cocok dengan file bernama persisapp.-inamesama dengan-nametapi gak membedakan huruf besar-kecil.-type fcuma file,-type dcuma folder (directory).- Urutan hasil
findmengikuti urutan penyimpanan di disk, jadi di laptopmu bisa berbeda.
Kenapa pola find harus pakai tanda kutip
budi@laptop:~/proyek-web$ find . -name *.log
./error.log
Tanpa kutip, app.log hilang dari hasil. Penyebabnya shell, bukan find: sebelum perintah jalan, bash mengganti *.log dengan nama-nama yang cocok di folder sekarang. Di ~/proyek-web cuma ada error.log, jadi yang sampai ke find adalah find . -name error.log. Dengan tanda kutip, bash membiarkan *.log apa adanya, dan find yang mencocokkannya di semua subfolder.
grep: cari teks di dalam file
budi@laptop:~/proyek-web$ grep "error" logs/app.log
2026-10-08 09:02:03 ERROR database connection error
2026-10-08 09:06:45 ERROR email service error: connection refused
budi@laptop:~/proyek-web$ grep -i "error" logs/app.log
2026-10-08 09:02:03 ERROR database connection error
2026-10-08 09:04:02 ERROR payment timeout
2026-10-08 09:06:45 ERROR email service error: connection refused
grep "pola" filemencetak setiap baris yang mengandung pola itu, utuh. Di Ubuntu, bagian yang cocok diwarnai merah.- grep membedakan huruf besar-kecil. Baris
ERROR payment timeoutgak mengandungerrorhuruf kecil, jadigrep "error"cuma mencetak 2 baris. Itu jawaban tebakannya. -i(ignore case) menyamakan besar-kecil, jadi ketiga barisERRORikut.
Flag yang sering dipakai:
| Flag | Artinya | Contoh hasil |
|---|---|---|
-i |
Abaikan huruf besar-kecil | 3 baris, bukan 2 |
-n |
Tampilkan nomor baris | 7:2026-10-08 09:02:03 ERROR ... |
-c |
Cuma hitung baris yang cocok | grep -c -i "error" logs/app.log mencetak 3 |
-v |
Kebalikannya: baris yang gak cocok | |
-w |
Cocok sebagai kata utuh saja | -w "log" gak cocok dengan login |
grep -r: cari di semua file sekaligus
budi@laptop:~/proyek-web$ grep -r "TODO" .
./script.js:// TODO: add the order button
./src/main.js:// TODO: fetch the cake list from the API
budi@laptop:~/proyek-web$ grep -rl "TODO" .
./script.js
./src/main.js
-r(recursive) masuk ke semua file di folder itu dan subfolder-nya. Karena hasilnya dari banyak file, tiap baris diawali nama file dan titik dua.-lcuma mencetak nama file yang mengandung pola, tanpa barisnya. Cocok untuk "file mana saja yang masih punya TODO?".- Tanpa
.,grep -r "TODO"mencari di folder sekarang dan menulis namanya tanpa./di depan.
💡 Sekilas: ripgrep
Banyak developer memasang rg (ripgrep), pencari yang mirip grep -r tapi jauh lebih cepat untuk proyek besar, dan otomatis melewati file yang ada di .gitignore, seperti node_modules. Pencarian di VS Code juga memakai ripgrep di belakangnya. Bentuknya mirip: rg "TODO", rg -i "error" logs.
⚠️ Jebakan yang sering ketemu
- Pola find tanpa tanda kutip. Kalau di folder sekarang ada file yang cocok, shell mengganti polanya duluan dan find mencari nama yang salah. Selalu tulis
find . -name "*.log". - Lupa grep membedakan huruf besar-kecil.
grep "error"melewatkanERROR. Pakai-ikalau ragu. - grep tanpa nama file.
grep "TODO"tanpa file dan tanpa-rmenunggu ketikan dari keyboard, kelihatannya seperti macet. TekanCtrl+C, lalu tambahkan file atau-r .. - grep ke folder tanpa -r.
grep "TODO" srcdijawabgrep: src: Is a directory.
TL;DR: find mencari file dari namanya: find . -name "*.log" menemukan semua file berakhiran .log di folder ini dan semua subfolder-nya (-iname tanpa peduli huruf besar-kecil, -type f file, -type d folder), dan polanya wajib diberi tanda kutip supaya gak diganti shell duluan. grep mencari teks di dalam file dan mencetak setiap baris yang mengandungnya: -i abaikan besar-kecil, -n nomor baris, -c hitung, -v kebalikannya, -r semua file di folder, -l nama file saja. Nama file: find. Isi file: grep.