Perintah find Linux: Opsi -name, -type, -size, -mtime, dan -delete
Perintah find Linux menelusuri ke bawah dari folder awal dan menemukan file serta folder yang cocok dengan syarat seperti nama, jenis, ukuran, waktu modifikasi, dan izin. Setelah kami membuat sepuluh file di folder uji server AlmaLinux 9 dan menjalankannya sambil mengubah satu syarat setiap kali, file yang ditemukan akhirnya diteruskan dengan -exec ke perintah lain, dan saat menghapus, daftar diperiksa dulu dengan syarat yang sama sebelum -delete.
Path folder uji dan waktu file di kotak hasil diganti dengan nilai contoh. Pada output server Debian 12, hanya path folder home yang merupakan nilai contoh, selebihnya apa adanya.
1️⃣ Cara pakai perintah find Linux
Bentuk dasarnya [find path-awal syarat]. Jika path awal tidak ditulis, find mencari di folder saat ini (.), dan jika syarat tidak ditulis, semua file dan folder di bawah path awal dicetak.
Pengujian dilakukan di /root/work yang berisi tiga folder dan sepuluh file seperti di bawah.
find /root/work/root/work
/root/work/docs
/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs
/root/work/logs/app.log
/root/work/logs/cache.tmp
/root/work/backup
/root/work/report.txt
/root/work/README.md
/root/work/run.sh
/root/work/my notes.txt
/root/work/empty.txtfind tidak mengurutkan hasil menurut nama; pada eksekusi ini, saat sampai di folder docs, semua file di dalamnya dicetak lebih dulu, baru berlanjut ke logs.
Jika beberapa syarat ditulis berurutan, hanya file yang cocok dengan semuanya yang tersisa.
-name hanya membandingkan nama file dengan pola, bukan path. Apit pola dengan tanda kutip tunggal agar shell tidak memperluas * lebih dulu dan meneruskannya apa adanya ke find.
find /root/work -name '*.txt'/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/report.txt
/root/work/my notes.txt
/root/work/empty.txt-name membedakan huruf besar dan kecil. Mencari nama yang diawali readme hanya menampilkan docs/readme.txt, dan dengan -iname README.md ikut muncul.
find /root/work -name 'readme*'/root/work/docs/readme.txtfind /root/work -iname 'readme*'/root/work/docs/readme.txt
/root/work/README.mdfind ada di dalam paket findutils. Versi pada baris pertama [find --version] adalah findutils 4.8 di server AlmaLinux 9.8 dan 4.9 di server Debian 12.
2️⃣ find -type d dan -maxdepth
-type f menyisakan file biasa saja, dan -type d menyisakan folder saja.
find /root/work -type d/root/work
/root/work/docs
/root/work/logs
/root/work/backupPath awal /root/work juga folder, jadi ikut muncul di baris pertama. Dengan -type f pada path yang sama, sepuluh file muncul semua.
-maxdepth menentukan berapa tingkat turun dari path awal. Dengan -maxdepth 1, file di docs dan logs tidak ikut, dan hanya lima file tepat di bawah /root/work yang tersisa.
find /root/work -maxdepth 1 -type f/root/work/report.txt
/root/work/README.md
/root/work/run.sh
/root/work/my notes.txt
/root/work/empty.txtSebaliknya, -mindepth 2 melewati yang tepat di bawah path awal dan hanya mencetak lima file di dalam subfolder.
find /root/work -mindepth 2 -type f/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmpHalaman man menyarankan opsi global seperti -maxdepth ditulis tepat setelah path awal. Menulis -maxdepth 1 setelah -type f tetap memberi lima file yang sama, tetapi di terminal muncul satu baris peringatan agar opsi global ditulis di depan (menurut halaman man).
Untuk hanya melihat jumlah folder atau file, teruskan output ke wc -l. Menghitung output -type d memberi 4, termasuk path awal.
find /root/work -type d | wc -l4Dengan -maxdepth 1 hasilnya tetap 4, karena ketiga subfolder berada tepat di bawah path awal.
find /root/work -maxdepth 1 -type d | wc -l4Menghitung hanya file di dalam subfolder dengan -mindepth 2 memberi 5.
find /root/work -mindepth 2 -type f | wc -l53️⃣ Syarat ukuran dan waktu perintah find
Tanda + di depan angka berarti lebih besar dari nilai itu, - berarti lebih kecil, dan tanpa tanda berarti tepat nilai itu. Satuan -size ada di tabel di bawah (menurut halaman man).
| Satuan | Ukuran | Ya |
|---|---|---|
| c | 1 byte | -size +500c |
| k | 1,024 byte | -size +1k |
| M | 1,048,576 byte | -size +1M |
| G | 1,073,741,824 byte | -size +1G |
| (tidak ada) | Blok 512 byte | -size +2 |
find /root/work -type f -size +1k/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txtFile yang lebih besar dari 1k adalah guide.txt 5,000 byte, app.log 2MB, dan report.txt 1,200 byte.
find /root/work -size +1M/root/work/logs/app.logDengan menulis -size dua kali untuk menetapkan rentang, hanya dua file yang lebih besar dari 1k dan lebih kecil dari 100k yang tersisa.
find /root/work -type f -size +1k -size -100k/root/work/docs/guide.txt
/root/work/report.txt-size membagi ukuran dengan satuan dan membulatkannya ke atas sebelum membandingkan. Karena itu README.md 300 byte juga dihitung 1k, dan -size -1k hanya menampilkan empty.txt berukuran 0.
find /root/work -type f -size -1k/root/work/empty.txtUntuk melihat syarat waktu, kami mengatur waktu modifikasi README.md, my notes.txt, dan docs/readme.txt ke 3 hari lalu, serta dua file .tmp ke 10 hari lalu. Setiap file menyimpan tiga waktu, yaitu akses, modifikasi, dan perubahan, yang dapat diperiksa dengan perintah stat.
-mtime menghitung waktu sejak modifikasi terakhir dalam satuan 24 jam. -mtime -1 menampilkan lima file yang dibuat dalam 24 jam.
find /root/work -type f -mtime -1/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txt
/root/work/run.sh
/root/work/empty.txt-mtime +7 hanya menampilkan dua file .tmp yang diatur ke 10 hari lalu. Gunakan bentuk ini untuk memeriksa daftar sebelum menghapus log lama atau file sementara.
find /root/work -type f -mtime +7/root/work/docs/old.tmp
/root/work/logs/cache.tmp-mmin melakukan perhitungan yang sama dalam menit. Hasil -mmin -60 adalah lima file yang sama dengan -mtime -1.
find /root/work -type f -mmin -60/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txt
/root/work/run.sh
/root/work/empty.txt-newer menemukan file yang dimodifikasi lebih baru dari file acuan. Dengan README.md yang diatur ke 3 hari lalu sebagai acuan, muncul lima file yang dibuat sesudahnya.
find /root/work -type f -newer /root/work/README.md/root/work/docs/guide.txt
/root/work/logs/app.log
/root/work/report.txt
/root/work/run.sh
/root/work/empty.txt-empty menemukan file berukuran 0 sekaligus folder kosong, dan muncul folder kosong backup serta empty.txt.
find /root/work -empty/root/work/backup
/root/work/empty.txt4️⃣ Syarat -perm dan -user pada find
Jika setelah -perm hanya ditulis angka, find mencari file dengan izin tepat nilai itu. -perm 644 mengecualikan run.sh dengan 755 dan my notes.txt dengan 600, dan menampilkan delapan file.
find /root/work -type f -perm 644/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmp
/root/work/report.txt
/root/work/README.md
/root/work/empty.txtJika - ditulis di depan mode, find mencari file yang memiliki semua izin tertulis. Yang memiliki izin eksekusi pemilik (u+x) hanya run.sh.
find /root/work -type f -perm -u+x/root/work/run.shJika / ditulis di depan mode, cukup satu saja dari izin tertulis. 6000 adalah jumlah SUID (4000) dan SGID (2000), dan bentuk ini dipakai untuk memeriksa file di server yang saat dijalankan bekerja dengan izin pemilik atau grupnya.
Folder uji tidak memiliki file seperti itu, jadi setelah run.sh diberi SUID dan dijalankan, run.sh muncul.
chmod u+s /root/work/run.shfind /root/work -type f -perm /6000/root/work/run.shDi materi lama, tempat yang sama berisi -perm +6000. Saat dijalankan apa adanya, hasilnya berakhir dengan error [invalid mode].
find /root/work -type f -perm +6000find: invalid mode '+6000'Bentuk + dihapus di findutils 4.5.12 (menurut halaman man), jadi tulis /. SUID yang diberikan untuk pengujian dihapus dengan chmod u-s.
-user menyaring menurut nama pemilik. Semua file uji dimiliki root, jadi -user root saja tidak menyaring apa pun; setelah -name ditambahkan untuk memilih file .log, hanya app.log yang muncul.
find /root/work -type f -user root -name '*.log'/root/work/logs/app.log-nouser menemukan file yang UID pemiliknya tidak memiliki akun. Ini dipakai untuk memeriksa file yang tertinggal di server setelah akun dihapus; setelah pemilik guide.txt diubah ke UID 1500 yang tidak ada, guide.txt muncul.
chown 1500:1500 /root/work/docs/guide.txtfind /root/work -nouser/root/work/docs/guide.txt-nogroup melakukan pemeriksaan yang sama pada grup, dan guide.txt yang grupnya juga diubah ke 1500 muncul. Setelah pengujian, kami mengembalikannya dengan chown root:root.
Jika -o diletakkan di antara syarat, satu saja sudah cukup. Saat dipakai bersama syarat lain seperti -type f, kelompokkan syarat yang dihubungkan -o dengan tanda kurung. Beri garis miring terbalik di depan tanda kurung agar shell tidak menafsirkannya lebih dulu, dan beri spasi antara tanda kurung dan syarat.
find /root/work -type f \( -name '*.log' -o -name '*.tmp' \)/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmp! membalik syarat tepat di belakangnya. Mencari file yang bukan .txt menampilkan lima file.
find /root/work -type f ! -name '*.txt'/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmp
/root/work/README.md
/root/work/run.sh5️⃣ Memakai find -exec
-exec menjalankan perintah di belakangnya untuk setiap file yang ditemukan, dan path yang ditemukan masuk ke tempat {}. ; di akhir perintah ditulis \; agar shell tidak membacanya lebih dulu sebagai pemisah perintah.
find /root/work -name '*.log' -exec ls -l {} \;-rw-r--r-- 1 root root 2097152 Oct 5 14:10 /root/work/logs/app.logJika diakhiri + alih-alih \;, path yang ditemukan dikumpulkan dan perintah hanya dijalankan sekali. Saat dibandingkan dengan echo, \; mencetak lima path dalam lima baris dan + dalam satu baris.
find /root/work -name '*.txt' -exec echo {} \;/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/report.txt
/root/work/my notes.txt
/root/work/empty.txtfind /root/work -name '*.txt' -exec echo {} +/root/work/docs/readme.txt /root/work/docs/guide.txt /root/work/report.txt /root/work/my notes.txt /root/work/empty.txtPerintah yang menerima banyak path seperti ls dikelompokkan dengan + untuk mengurangi jumlah eksekusi. Ukuran tiga file yang lebih besar dari 1k diperiksa dengan satu ls -lh.
find /root/work -type f -size +1k -exec ls -lh {} +-rw-r--r-- 1 root root 4.9K Oct 5 14:10 /root/work/docs/guide.txt
-rw-r--r-- 1 root root 2.0M Oct 5 14:10 /root/work/logs/app.log
-rw-r--r-- 1 root root 1.2K Oct 5 14:10 /root/work/report.txt-exec juga dipakai untuk merapikan izin folder web secara massal, 644 untuk file dan 755 untuk folder. Sebelum menjalankannya, kami mencari file dengan nilai berbeda dan muncul run.sh serta my notes.txt.
find /root/work -type f ! -perm 644/root/work/run.sh
/root/work/my notes.txtFile dan folder memiliki izin berbeda, jadi jalankan terpisah dengan -type f dan -type d. chmod juga menerima banyak path, jadi kami mengakhirinya dengan +.
find /root/work -type f -exec chmod 644 {} +find /root/work -type d -exec chmod 755 {} +Saat dicari lagi dengan syarat yang sama, tidak ada yang muncul, dan folder backup yang sebelumnya diubah ke 700 juga menjadi 755.
Namun run.sh juga menjadi 644 sehingga saat dijalankan muncul [Permission denied]. Di folder yang berisi file eksekusi, beri kembali izin eksekusi pada file itu dengan chmod +x.
Untuk mengubah hanya file di dalam subfolder, tambahkan -mindepth 2. Dengan 660, hanya lima file di docs dan logs yang berubah, dan setelah diperiksa kami mengembalikannya ke 644.
find /root/work -mindepth 2 -type f -exec chmod 660 {} +find /root/work -type f -perm 660/root/work/docs/readme.txt
/root/work/docs/guide.txt
/root/work/docs/old.tmp
/root/work/logs/app.log
/root/work/logs/cache.tmpMenggabungkan find dan grep memungkinkan pencarian menurut isi file, bukan nama. Untuk membuat situasi pemeriksaan web shell, kami membuat empat file PHP di folder terpisah /root/site dan menaruh string [base64_decode] di html-cache.php dan photo.php pada folder upload.
find /root/site -type f/root/site/lib/func.php
/root/site/upload/html-cache.php
/root/site/upload/photo.php
/root/site/index.phpJika nama web shell diketahui, cari dengan -name. Dengan -maxdepth 2 agar turun hanya sampai folder upload, hanya html-cache.php yang muncul.
find /root/site -maxdepth 2 -type f -name 'html*.php'/root/site/upload/html-cache.phpphoto.php yang namanya biasa tidak muncul di sini. Menjalankan grep -l lewat -exec hanya mencetak path file yang berisi string, dan kedua file muncul.
find /root/site -name '*.php' -exec grep -l 'base64_decode' {} +/root/site/upload/html-cache.php
/root/site/upload/photo.php[base64_decode] adalah fungsi yang juga ada di file inti WordPress, jadi buka dan periksa isi file yang ditemukan sebelum menghapusnya.
-print0 menaruh karakter null, bukan baris baru, di antara path. Karakter null tidak terlihat di layar, sehingga path tampil menyambung dalam satu baris.
find /root/work -name '*.txt' -print0/root/work/docs/readme.txt/root/work/docs/guide.txt/root/work/report.txt/root/work/my notes.txt/root/work/empty.txtSaat meneruskan nama berspasi seperti my notes.txt ke perintah lain tanpa terputus, output -print0 dipasangkan dengan xargs -0 (menurut halaman man).
6️⃣ Menghapus file dengan find dan opsi
Sebelum menghapus, jalankan dulu syarat yang sama tanpa menghapus dan periksa sendiri daftar file yang akan dihapus.
find /root/work -name '*.tmp'/root/work/docs/old.tmp
/root/work/logs/cache.tmp-exec rm {} \; menjalankan rm untuk setiap file yang ditemukan. Saat dijalankan hanya di folder logs, cache.tmp terhapus dan hanya app.log yang tersisa.
find /root/work/logs -name '*.tmp' -exec rm {} \;ls /root/work/logsapp.log-delete membuat find menghapus langsung tanpa menjalankan rm. Saat dijalankan tidak mencetak apa pun, dan saat dicari lagi dengan syarat yang sama tidak ada file .tmp yang tersisa.
find /root/work -name '*.tmp' -deletefind /root/work -name '*.tmp'-delete harus selalu ditulis setelah syarat. find menghitung baris perintah dari depan sebagai satu ekspresi, jadi jika -delete ditaruh paling depan, find berusaha menghapus semua di bawah path awal sebelum melihat syarat (menurut halaman man).
🔲 Opsi perintah find
📌 Opsi utama: hasil dari artikel ini
| Opsi | Fungsi | Hasil di artikel ini | |
|---|---|---|---|
| -name | Menemukan nama yang cocok dengan pola (membedakan huruf besar kecil) | '*.txt' memberi lima file, 'readme*' hanya docs/readme.txt | |
| -iname | Membandingkan nama tanpa membedakan huruf besar kecil | 'readme*' memberi docs/readme.txt dan README.md | |
| -type f, -type d | Hanya menyisakan file biasa (f) atau folder (d) | -type d memberi empat folder termasuk path awal, -type f sepuluh file | |
| -maxdepth | Hanya turun sampai N tingkat di bawah path awal | -maxdepth 1 hanya menyisakan lima file tepat di bawah /root/work | |
| -mindepth | Melewati tingkat di atas N dari path awal | -mindepth 2 hanya memberi lima file di dalam subfolder | |
| -size | Mencari menurut ukuran (+ lebih besar, - lebih kecil, satuan c, k, M, G) | -size +1k memberi tiga file, -size -1k hanya empty.txt | |
| -mtime | Membandingkan waktu sejak isi dimodifikasi dalam satuan 24 jam | -mtime -1 memberi lima file, -mtime +7 dua file .tmp | |
| -mmin | Membandingkan waktu sejak modifikasi dalam menit | -mmin -60 memberi lima file yang sama dengan -mtime -1 | |
| -ctime | Membandingkan dalam satuan 24 jam sampai perubahan info file seperti izin dan nama | -ctime -1 memberi sepuluh file uji | |
| -newer | Menemukan yang dimodifikasi lebih baru dari file acuan | Lima file dengan README.md yang diatur ke 3 hari lalu sebagai acuan | |
| -empty | Menemukan file berukuran 0 dan folder kosong | Memberi folder kosong backup dan empty.txt | |
| -perm | Mencari menurut izin (angka saja: tepat nilai itu, - di depan: semua izin tertulis, / di depan: salah satunya) | -perm 644 memberi delapan file, -perm -u+x memberi run.sh, dan -perm /6000 memberi run.sh setelah SUID | |
| -user | Menyaring menurut nama pemilik | Bersama -name '*.log' memberi app.log, akun yang tidak ada berakhir dengan error | |
| -nouser | Menemukan yang UID pemiliknya tidak memiliki akun | Memberi guide.txt dengan UID diubah ke 1500 | |
| -nogroup | Menemukan yang GID grupnya tidak memiliki grup | Memberi guide.txt dengan GID diubah ke 1500 | |
| -o | Menyisakan yang cocok dengan salah satunya (dalam kurung jika bersama syarat lain) | Mengelompokkan .log dan .tmp memberi tiga file | |
| ! | Membalik syarat tepat di belakangnya | Memberi lima file yang bukan .txt | |
| -exec | Menjalankan perintah di belakangnya untuk tiap file yang ditemukan (path di tempat {}) | Jika diakhiri +, satu echo mencetak lima path dalam satu baris | |
| -print0 | Menaruh karakter null, bukan baris baru, di antara path | Karakter null tidak terlihat, path menyambung dalam satu baris | |
| -delete | find langsung menghapus file yang ditemukan (ditulis setelah syarat) | Tidak mencetak apa pun, saat dicari lagi tidak ada file .tmp |
📎 Opsi lainnya: menurut manual resmi
| Opsi | Fungsi | |
|---|---|---|
| -L | Mengikuti tautan simbolik dan memakai info file tujuan | |
| -path | Membandingkan seluruh path, bukan nama, dengan pola shell | |
| -regex | Membandingkan seluruh path dengan ekspresi reguler | |
| -iregex | Membandingkan seperti -regex tanpa membedakan huruf besar kecil | |
| -atime | Membandingkan waktu sejak akses terakhir dalam satuan 24 jam | |
| -cnewer | Menemukan yang statusnya berubah setelah waktu modifikasi file acuan | |
| -group | Menyaring menurut nama grup pemilik | |
| -xdev | Tidak turun ke folder di sistem file lain | |
| -daystart | Menghitung syarat waktu dari pukul 00.00 hari ini, bukan 24 jam lalu | |
| -prune | Jika berupa folder, tidak turun ke dalamnya | |
| -quit | Langsung berakhir (-print -quit hanya mencetak hasil pertama) | |
| -printf | Mencetak dengan format yang Anda tentukan | |
| -ls | Mencetak file yang ditemukan dalam format ls -dils | |
| -fprint | Menyimpan path yang ditemukan ke file tertentu, bukan ke layar | |
| -ok | Berjalan seperti -exec, tetapi bertanya dulu | |
| -execdir | Berjalan seperti -exec, tetapi menjalankan perintah di folder file yang ditemukan |
🔲 Simulator perintah find
Simulator di bawah adalah server virtual berisi folder uji yang sama, tempat Anda dapat menjalankan sendiri syarat seperti -name, -type, -size, -mtime, -perm, serta -exec dan -delete.
7️⃣ Error perintah find
Jika pola ditulis tanpa tanda kutip, shell memakai aturan Wildcard dan lebih dulu memperluasnya menjadi nama file di folder saat ini. Saat pindah ke folder docs dan menulis *.txt tanpa tanda kutip, shell mengubahnya menjadi dua nama guide.txt dan readme.txt lalu meneruskannya, dan muncul error di bawah.
cd /root/work/docsfind /root/work -name *.txtfind: paths must precede expression: `readme.txt'
find: possible unquoted pattern after predicate `-name'?Kode keluarnya 1.
Jika \; atau + di akhir -exec terlewat, muncul [missing argument to `-exec’].
find /root/work -name '*.log' -exec ls -l {}find: missing argument to `-exec'Path awal yang tidak ada memberi [No such file or directory] dan berakhir dengan kode keluar 1.
find /nonexistent-dir -name xfind: '/nonexistent-dir': No such file or directoryNama akun yang tidak ada pada -user, atau nilai selain huruf yang ditentukan seperti f dan d pada -type, langsung berakhir dengan error tanpa memulai pencarian.
find /root/work -user nosuchuserfind: 'nosuchuser' is not the name of a known userfind /root/work -type xfind: Unknown argument to -type: xDengan akun biasa di server Debian 12, kami mengubah izin folder lock di dalam folder uji menjadi 000 lalu mencari di folder uji. Isi lock tidak terbaca, muncul [Permission denied], dan kode keluarnya 1.
find ~/findtest/home/user/findtest
/home/user/findtest/report.txt
/home/user/findtest/lock
find: '/home/user/findtest/lock': Permission denied
/home/user/findtest/docs
/home/user/findtest/docs/readme.txtUntuk menyembunyikan baris error saja, tambahkan 2>/dev/null. Teks error hilang, tetapi kode keluar tetap 1.
find ~/findtest -name '*.txt' 2>/dev/null/home/user/findtest/report.txt
/home/user/findtest/docs/readme.txt🔢 FAQ & Konten yang Direkomendasikan
Pencarian isi
Perintah grep Linux
Artikel tentang perintah grep yang menemukan teks di dalam file dan mencetak baris itu, beserta opsinya.
Penghapusan
Perintah rm Linux: Opsi rm -rf dan Cara Menghapus Tanpa Konfirmasi
Artikel tentang opsi -r dan -f serta pertanyaan konfirmasi pada perintah rm saat menghapus file dan folder.
Ruang disk
Perintah du: Memeriksa ruang disk file
Artikel tentang cara menjumlahkan ruang disk yang dipakai folder dan file dengan perintah du.
ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.