Semakin rajin kita bekerja di terminal, semakin banyak file tersebar, dan mencari satu file di antara ratusan entri lewat ls bukan lagi pilihan. Linux menyediakan find — alat pencari yang menelusuri pohon direktori dan menyaring hasil berdasarkan nama, jenis, ukuran, hingga waktu modifikasi. Pada Chapter ini kita akan memakai find dengan predicate (syarat pencarian) bertingkat, mengenal locate yang mencari lewat database, dan menindaklanjuti hasil pencarian tanpa mengetik ulang nama filenya.
find: menelusuri pohon direktori langsung #
Cara kerjanya ampuh: mulai dari path yang diberikan sebagai argument, find menelusuri setiap entri secara rekursif dan menguji entri itu terhadap predicate yang kita susun; yang lolos semua predicate dicetak namanya. Predicate yang paling sering dipakai dirangkum berikut:
| Predicate | Mencocokkan entri yang |
|---|---|
-name "*.txt" | namanya berakhiran .txt (peka kapital) |
-type f atau -type d | berupa file biasa / direktori |
-size +1M | berukuran lebih dari 1 MiB |
-mtime -1 | dimodifikasi kurang dari 24 jam lalu |
Mari kita lihat dua predicate pertama bekerja:
mkdir -p proyek/log proyek/dokumen
printf "catatan\n" > proyek/catatan.txt
printf "aktivitas\n" > proyek/log/app.log
printf "panduan\n" > proyek/dokumen/panduan.md
find proyek -name "*.txt"
find proyek -type dOutput yang Dihasilkan:
proyek/catatan.txt
proyek
proyek/dokumen
proyek/logPerintah pertama, find proyek -name "*.txt", menelusuri seluruh isi proyek dan hanya mencetak file yang namanya cocok pola *.txt — satu entri. Perintah kedua, find proyek -type d, membalik lensanya: hanya direktori yang dicetak, sehingga kita melihat peta folder proyek, proyek/log, dan proyek/dokumen tanpa satu pun file. Predicate juga dirangkai: find proyek -type d -name "lo*" hanya mencetak direktori berawalan lo. Daftar predicate yang jauh lebih panjang tercantum pada halaman manual find(1)
.
Tanda kutip pada "*.txt" bukan hiasan. Tanpa kutip, shell akan mencoba menggantikan pola itu dengan daftar file di direktori sekarang sebelum find sempat membacanya — topik globbing yang akan kita bahas tuntas pada Chapter Wildcard dan Pattern Matching. Dengan kutip, pola tiba di find apa adanya.
Menyaring berdasarkan ukuran dan waktu #
Dua predicate berikutnya menjawab pertanyaan sehari-hari: file mana yang menghabiskan ruang, dan file mana yang baru saja diubah. Predicate -size menerima tanda lebih (+) atau kurang (-) diikuti angka dan satuan seperti k serta M:
mkdir -p unduhan
head -c 2097152 /dev/zero > unduhan/paket.iso
printf "catatan\n" > unduhan/catatan.txt
find unduhan -type f -size +1M
find unduhan -type f -size -10kOutput yang Dihasilkan:
unduhan/paket.iso
unduhan/catatan.txtFixture ini berisi file paket.iso sebesar tepat 2 MiB dan file kecil catatan.txt. Pencarian pertama menemukan yang besar (+1M berarti lebih dari 1 MiB), pencarian kedua menemukan yang kecil (-10k berarti di bawah 10 KiB). Kombinasi -type f mencegah direktori ikut terpilih, karena direktori pun punya ukuran meski isinya tidak dihitung.
Untuk waktu, predicate -mtime mengukur umur modifikasi dalam satuan 24 jam: -mtime -1 berarti diubah kurang dari sehari lalu, -mtime +30 berarti sudah lebih dari tiga puluh hari. Agar latihan ini bisa diulang dengan hasil sama, kita pakai touch -d untuk menetapkan tanggal tetap pada salah satu file:
mkdir -p arsip
printf "log lama\n" > arsip/lama.txt
printf "log baru\n" > arsip/baru.txt
touch -d "2024-06-01 10:00" arsip/lama.txt
find arsip -type f -mtime -1Output yang Dihasilkan:
arsip/baru.txtBaris touch -d "2024-06-01 10:00" mengganti waktu modifikasi lama.txt menjadi tanggal itu, sehingga file itu sudah “berumur” lebih dari sehari. Hasilnya, find arsip -type f -mtime -1 hanya mencetak arsip/baru.txt — satu-satunya file yang benar-benar baru dibuat. Kebutuhan yang lebih presisi dilayani -newermt "2025-01-01", yang mencocokkan file dimodifikasi setelah tanggal tertentu tanpa pembulatan 24 jam.
Menindaklanjuti hasil pencarian dengan -exec #
Menemukan file biasanya baru setengah pekerjaan; sering kali kita ingin langsung mengukur, menyalin, atau menghapus yang ditemukan. Di sinilah -exec masuk: untuk setiap entri yang lolos predicate, find menjalankan perintah yang kita tentukan. Tanda {} diganti nama entri, dan tanda \; menutup perintahnya:
mkdir -p log
printf "aktivitas\n" > log/app.log
printf "debug\n" > log/debug.log
find . -name "*.log" -exec du -sh {} +Output yang Dihasilkan:
4.0K ./log/app.log
4.0K ./log/debug.logMari kita telaah baris terakhir:
find . -name "*.log": menelusuri direktori kerja (tanda.) mencari semua file berakhiran.log— di sini dua file di dalam folderlog.-exec du -sh {} +: menjalankandu -shpada hasil pencarian; tanda+memintafindmengumpulkan sebanyak mungkin nama file ke dalam satu pemanggilanduagar efisien.
Jadi find sekaligus menjadi alat ukur: dua file log itu masing-masing memakan 4,0 KiB ruang disk.
locate: pencarian berbasis database #
find teliti karena membaca direktori sungguhan, tetapi lambat bila titik mulainya luas — menelusuri seluruh / bisa memakan waktu. Perintah locate menempuh jalan sebaliknya: ia mencari di database berisi seluruh path filesystem yang dibangun oleh perintah updatedb. Karena hanya membaca satu file database, locate nyaris instan:
$ locate catatan.txt
/home/budi/proyek/catatan.txt
/home/budi/latihan-linux/catatan.txt
Contoh di atas adalah contoh tampilan, bukan output terverifikasi, dan ada dua konsekuensi yang melekat pada pendekatan ini. Pertama, database harus diperbarui dulu dengan updatedb — tugas berkala yang di sistem nyata dijalankan otomatis dan membutuhkan hak admin. Kedua, hasilnya bisa kadaluarsa: file yang baru dibuat belum terdaftar sampai pembaruan berikutnya. Pola locate juga berbeda dari find: locate catatan mencocokkan catatan di bagian mana pun dari path, bukan hanya di nama file terakhir.
Kedua alat ini menyapa kita dengan daftar nama file yang sering panjang. Kabar baiknya, shell punya cara memperlakukan banyak file sekaligus dengan satu perintah singkat — itulah materi Chapter Wildcard dan Pattern Matching.