Perintah find di Linux: mencari berkas berdasarkan nama, ukuran, dan tanggal
Perintah find menelusuri pohon direktori dan memilih berkas berdasarkan kondisi: find /path -name '*.log' mencari berdasarkan nama, -type f hanya berkas, -size +100M lebih besar dari 100 MB, -mtime -7 diubah dalam seminggu terakhir. Kondisi bisa digabung, dan hasilnya bisa diproses dengan -exec, -delete, atau diteruskan ke xargs.
Perintah find menelusuri pohon direktori dan menemukan berkas berdasarkan kondisi: nama, jenis, ukuran, tanggal modifikasi, pemilik, dan izin akses. Skema umumnya adalah find [lokasi pencarian] [kondisi] [aksi]. Di bawah ini dikumpulkan contoh find linux untuk tugas-tugas yang sering muncul: menemukan file konfigurasi, membersihkan log lama, dan mencari apa yang memakan ruang disk.
Sintaks perintah find
find /var/log -type f -name '*.log' -mtime +30 -print
Mari kita bahas bagian per bagian:
/var/log— titik awal pencarian. Anda bisa menyebutkan beberapa direktori sekaligus atau.(direktori saat ini). Tanpa path, GNU find mencari di direktori saat ini.-type f -name '*.log' -mtime +30— kondisi (dalam dokumentasi disebut test). Secara default, antar kondisi berlaku logika «DAN».-print— aksi: menampilkan path. Aksi ini otomatis dipakai jika tidak ada aksi lain.
find bekerja secara rekursif, masuk ke semua subdirektori. Jika Anda menjalankannya sebagai pengguna biasa pada path sistem, keluaran akan dipenuhi baris Permission denied. Hilangkan dengan mengalihkan aliran error:
find / -name 'nginx.conf' 2>/dev/null
Pencarian berdasarkan nama: -name dan -iname
Kondisi -name membandingkan hanya nama berkas (tanpa path) dengan pola. Pola mendukung * (karakter apa pun), ? (satu karakter), dan [abc] (salah satu karakter yang tercantum).
# nama persis
find /etc -name 'hosts'
# semua berkas .conf
find /etc -name '*.conf'
# tanpa membedakan huruf besar-kecil: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'
# report_1.csv ... report_9.csv
find . -name 'report_?.csv'
Pola selalu ditulis dalam tanda kutip. Tanpa kutip, shell akan lebih dulu mengembangkan *.conf menjadi berkas-berkas di direktori saat ini, sehingga find menerima daftar nama, bukan pola, dan hasilnya bisa tidak sesuai harapan atau perintah gagal dengan error paths must precede expression.
Pencarian berdasarkan path: -path dan -regex
Jika direktori juga penting, bukan hanya nama, gunakan -path — ia membandingkan pola dengan seluruh path:
# berkas .js hanya di dalam direktori src
find . -path '*/src/*' -name '*.js'
Untuk pola yang lebih kompleks tersedia -regex (regular expression juga dicocokkan dengan path lengkap) dan -iregex yang tidak membedakan huruf besar-kecil:
find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'
Cara mengecualikan direktori
Agar find tidak masuk ke, misalnya, node_modules atau .git, gunakan -prune:
find . -path ./node_modules -prune -o -name '*.js' -print
Dibaca begini: «jika path adalah ./node_modules, jangan turun ke dalamnya, jika tidak (-o) tampilkan berkas *.js». -print di akhir wajib ditulis, jika tidak direktori yang dikecualikan itu sendiri ikut tercetak. Alternatif yang lebih sederhana tetapi lebih lambat adalah -not -path '*/node_modules/*': find tetap menelusuri direktori tersebut, hanya saja hasilnya disaring.
Pencarian berdasarkan jenis: -type
| Nilai | Yang dicari |
|---|---|
-type f | berkas biasa |
-type d | direktori |
-type l | symbolic link |
-type s | socket |
-type p | named pipe (FIFO) |
# hanya direktori bernama logs
find / -type d -name 'logs' 2>/dev/null
# berkas dan direktori kosong
find . -type f -empty
find . -type d -empty
# symbolic link yang rusak
find . -xtype l
Pencarian berdasarkan ukuran: -size
Kondisi -size menerima angka dengan sufiks: c — byte, k — kilobyte, M — megabyte, G — gigabyte. Tanda + berarti «lebih besar», - berarti «lebih kecil», tanpa tanda berarti «tepat».
# berkas lebih besar dari 100 MB di seluruh sistem
find / -type f -size +100M 2>/dev/null
# antara 10 dan 50 MB
find . -type f -size +10M -size -50M
# kurang dari 1 KB
find . -type f -size -1k
Ada satu catatan: ukuran dibulatkan ke atas sesuai satuan. Karena itu -size -1M hanya menemukan berkas kosong — berkas tidak kosong apa pun, setelah dibulatkan, dianggap «minimal 1 megabyte». Untuk batas yang tepat, gunakan satuan yang lebih kecil: -size -1024k.
Apa yang memakan ruang disk
Kombinasi find dengan ls dan sort menampilkan berkas terbesar:
find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm 1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root adm 96M Oct 14 09:15 /var/log/nginx/access.log
Untuk memperkirakan ukuran seluruh direktori, du -sh lebih praktis. find berguna ketika satu berkas besar yang tersembunyi jauh di dalam pohon menjadi penyebab utamanya.
Pencarian berdasarkan tanggal: -mtime, -mmin, -newer
Setiap berkas memiliki tiga cap waktu, dan find bisa menyaring berdasarkan masing-masing:
| Kondisi | Cap waktu | Satuan |
|---|---|---|
-mtime / -mmin | perubahan isi | hari / menit |
-atime / -amin | terakhir dibaca | hari / menit |
-ctime / -cmin | perubahan metadata (izin, pemilik, nama) | hari / menit |
Tanda bekerja seperti pada ukuran: -mtime -7 — diubah kurang dari 7 hari yang lalu, -mtime +30 — diubah lebih dari 30 hari yang lalu.
# diubah dalam seminggu terakhir
find ~/projects -type f -mtime -7
# log yang lebih lama dari 30 hari
find /var/log -type f -name '*.log' -mtime +30
# diubah dalam 15 menit terakhir
find /etc -type f -mmin -15
Satu hari dihitung sebagai periode utuh 24 jam, bagian pecahannya dibuang. Akibatnya -mtime +1 menemukan berkas yang lebih tua dari 48 jam, bukan 24 jam — jebakan yang sering terjadi. Jika perlu ketepatan, beralihlah ke menit: -mmin +1440.
Berkas yang lebih baru dari berkas atau tanggal lain
# diubah setelah deploy.lock terakhir diubah
find . -type f -newer deploy.lock
# diubah setelah tanggal tertentu (GNU find)
find . -type f -newermt '2026-10-01'
# dalam rentang tanggal
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'
Pencarian berdasarkan pemilik dan izin
# berkas milik pengguna alice
find /home -user alice
# berkas tanpa pemilik yang valid (setelah pengguna dihapus)
find / -nouser 2>/dev/null
# berkas dengan izin tepat 777
find /var/www -type f -perm 777
# berkas yang bisa ditulis oleh semua orang
find /var/www -perm -o=w
# berkas dengan bit SUID — berguna saat audit keamanan
find / -perm -4000 -type f 2>/dev/null
Opsi -perm memiliki tiga bentuk: tanpa tanda — izin harus persis sama, dengan - — minimal semua bit yang disebut harus aktif, dengan / — minimal salah satu dari bit tersebut aktif.
Logika kondisi: DAN, ATAU, TIDAK
Kondisi secara default digabung dengan «DAN». Untuk «ATAU» dipakai -o, untuk negasi dipakai ! atau -not. Pengelompokan dilakukan dengan tanda kurung, yang harus di-escape agar tidak ditafsirkan shell:
# gambar jpg atau png
find . -type f \( -name '*.jpg' -o -name '*.png' \)
# semua kecuali berkas .tmp
find . -type f ! -name '*.tmp'
Tanpa tanda kurung, -type f hanya berlaku untuk kondisi pertama dari pasangan «ATAU», sehingga direktori bernama *.png ikut masuk hasil. Spasi di sekitar \( dan \) wajib ada.
Kedalaman pencarian: -maxdepth dan -mindepth
# hanya di direktori saat ini, tanpa subdirektori
find . -maxdepth 1 -type f -name '*.sh'
# mulai dari level kedua di bawah
find . -mindepth 2 -name '*.md'
# jangan berpindah ke sistem berkas lain
find / -xdev -type f -size +1G
Tulis -maxdepth tepat setelah path, sebelum kondisi lainnya, jika tidak GNU find akan memberi peringatan. Opsi -xdev berguna saat mencari dari /: find tidak akan masuk ke /proc, disk jaringan, maupun disk yang dipasang (mount).
Aksi terhadap hasil: -exec, -delete, xargs
-exec: menjalankan perintah untuk setiap berkas
Alih-alih {}, find akan menyisipkan path berkas. Perintah diakhiri dengan \; atau +:
# satu kali jalan per berkas
find . -name '*.sh' -exec chmod +x {} \;
# semua berkas dalam satu daftar — lebih cepat
find . -name '*.log' -exec gzip {} +
# dengan konfirmasi untuk setiap berkas
find . -name '*.bak' -ok rm {} \;
Varian dengan + mengumpulkan path dalam kelompok dan menjalankan perintah jauh lebih jarang, sehingga pada ribuan berkas jauh lebih cepat. Varian dengan \; diperlukan jika perintah hanya menerima satu berkas atau {} tidak berada di akhir.
-delete: menghapus hasil pencarian
# lihat dulu apa yang akan terhapus
find /tmp/build -type f -name '*.o' -mtime +7
# baru hapus
find /tmp/build -type f -name '*.o' -mtime +7 -delete
Selalu jalankan perintah tanpa -delete dan periksa daftarnya. Tulis -delete sebagai yang terakhir: find mengevaluasi ekspresi dari kiri ke kanan, sehingga find . -delete -name '*.o' akan menghapus semua isi direktori lebih dulu, baru kemudian memeriksa nama.
find dan xargs
Kombinasi klasik adalah meneruskan daftar berkas ke program lain melalui xargs. Agar tidak gagal pada nama yang mengandung spasi, gunakan pemisah byte nol:
find . -type f -name '*.txt' -print0 | xargs -0 wc -l
Flag -P pada xargs menjalankan pemrosesan secara paralel:
find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng
find dan grep: mencari teks di dalam berkas
find mencari berkas, bukan isinya. Untuk mencari baris di dalam berkas yang dipilih, serahkan hasilnya ke grep:
# di mana saja file konfigurasi memuat listen 8080
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4: listen 8080;
Flag -H mencetak nama berkas, -n — nomor baris, sedangkan grep -l hanya menampilkan nama berkas yang cocok. Jika filter hanya berdasarkan ekstensi, grep saja sudah cukup: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.
Format keluaran sendiri: -printf
GNU find bisa mencetak lebih dari sekadar path. Misalnya ukuran, tanggal, dan nama:
find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n
Di sini %s adalah ukuran dalam byte, %T... adalah tanggal modifikasi per bagian, dan %p adalah path. Ini praktis untuk skrip: tidak perlu mengurai keluaran ls.
Contekan: contoh find linux untuk sehari-hari
| Tugas | Perintah |
|---|---|
| Mencari berkas berdasarkan nama | find / -name 'file.txt' 2>/dev/null |
| Tanpa membedakan huruf besar-kecil | find . -iname '*.jpg' |
| Hanya direktori | find . -type d -name 'cache' |
| Berkas lebih dari 1 GB | find / -xdev -type f -size +1G |
| Diubah dalam sehari | find . -type f -mtime -1 |
| Diubah dalam satu jam | find . -type f -mmin -60 |
| Hapus log lebih dari 30 hari | find /var/log/app -name '*.log' -mtime +30 -delete |
| Direktori kosong | find . -type d -empty |
| Ubah izin semua direktori | find . -type d -exec chmod 755 {} + |
| Teks di dalam berkas | find . -name '*.py' -exec grep -l 'TODO' {} + |
| Menghitung berkas | find . -type f | wc -l |
Kesalahan yang sering terjadi
- Pola tanpa kutip.
find . -name *.logrusak jika di direktori saat ini ada satu saja file.log. Tulis'*.log'. - Banjir Permission denied. Tambahkan
2>/dev/nullatau jalankan dengansudojika memang perlu memeriksa seluruh disk. -deletedi posisi yang salah. Opsi ini harus selalu paling akhir, dan sebelumnya dilakukan uji coba tanpa penghapusan.- Nama dengan spasi dalam pipeline.
find ... | xargs rmakan memecah «My File.txt» menjadi dua argumen. Gunakan-print0denganxargs -0, atau-exec. - Mengharapkan jumlah hari yang tepat dari
-mtime. Untuk interval yang tepat gunakan-mminatau-newermt.
Kesimpulan
find adalah alat pencarian serbaguna pada sistem berkas: path, kemudian kondisi berdasarkan nama, jenis, ukuran, tanggal, dan izin, lalu aksi. Kuasai lima pilar — -name, -type, -size, -mtime, dan -exec ... + — dan sebagian besar tugas selesai dalam satu baris. Contoh find linux di atas sebaiknya dicoba langsung di terminal Anda, dan kombinasi find dengan grep, sed, serta awk kami bahas secara praktis dalam pelajaran kursus Linux tentang pengolahan teks di terminal.
Pertanyaan umum
Apa perbedaan find dan locate?
locate mencari dari basis data nama yang dibangun sebelumnya, sehingga sangat cepat, tetapi tidak melihat berkas yang dibuat setelah basis data terakhir diperbarui dengan updatedb. find menelusuri disk secara langsung dan bisa menyaring berdasarkan ukuran, tanggal, serta izin.
Bagaimana cara mencari berkas berdasarkan isinya, bukan namanya?
find sendiri tidak membaca isi berkas. Gunakan grep -rn 'teks' /path, atau kombinasi find . -name '*.conf' -exec grep -l 'teks' {} +.
Mengapa find lambat saat dijalankan dari root disk?
Ia menelusuri semua direktori, termasuk /proc, /sys, dan disk yang dipasang. Batasi pencarian ke direktori tertentu, tambahkan -xdev dan -maxdepth, atau kecualikan bagian yang tidak perlu dengan -prune.
Bisakah hasil find diurutkan berdasarkan tanggal?
Bisa: find . -type f -printf '%T@ %p\n' | sort -n menampilkan berkas dari yang paling lama ke yang paling baru, di mana %T@ adalah waktu modifikasi dalam detik sejak epoch.
Bagaimana cara mencari dan menghapus direktori kosong?
Perintah find . -type d -empty -delete akan menghapus semua direktori kosong, termasuk yang menjadi kosong setelah subdirektorinya dihapus. Jalankan dulu tanpa -delete dan periksa daftarnya.
Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.
Ke kursus