Perintah find Linux: cari file menurut nama, ukuran, dan waktu

Perintah find menelusuri direktori awal beserta isinya untuk mencari file atau direktori yang memenuhi kondisi. Anda dapat menggabungkan nama, jenis, ukuran, dan waktu perubahan, lalu menampilkan jalur atau menjalankan tindakan pada hasil. Mulailah dengan pencarian yang hanya menampilkan hasil sebelum memakai tindakan yang mengubah data.

Cara kerja find

Baris perintah terdiri dari titik awal lalu ekspresi. Ekspresi berisi pengujian, operator logika, dan tindakan. Pengujian yang bersebelahan dihubungkan dengan AND secara bawaan, sedangkan -o berarti OR. Aturan prioritas menentukan pengelompokan kondisi; hasil suatu pengujian juga dapat membuat bagian ekspresi berikutnya tidak perlu dijalankan. Pada pencarian biasa tanpa tindakan eksplisit, jalur yang cocok ditampilkan melalui -print.

Find membaca keadaan sistem berkas saat penelusuran berlangsung, bukan basis data nama file. Hasilnya bukan rekaman sesaat yang membekukan seluruh pohon: file dapat berubah atau dipindahkan selama proses. Contoh berikut mengacu pada GNU find. Periksa find --version, find --help, dan man find untuk implementasi yang digunakan.

Sintaks dasar

find [JALUR-AWAL]... [EKSPRESI]

Ganti penanda dengan jalur dan kondisi nyata. . berarti direktori saat ini; GNU find juga memakai direktori ini bila titik awal tidak diberikan. Untuk jalur yang diawali tanda hubung, gunakan bentuk seperti ./-arsip atau jalur absolut agar tidak dianggap sebagai ekspresi. Tentukan titik awal sesempit yang diperlukan, terutama sebelum tindakan pengubahan data.

Penggunaan dasar find

Cari berdasarkan nama

Contoh berikut mencari nama yang berakhir dengan .log di direktori saat ini dan subdirektorinya. -name memeriksa nama terakhir tanpa bagian direktori dan membedakan huruf besar/kecil. Tanda kutip menjaga pola *.log agar diterima find, bukan diperluas lebih dahulu oleh shell. Gunakan -type f bila hanya menginginkan file biasa, sebab direktori bernama dengan akhiran .log juga dapat cocok.

find . -name '*.log'

Gabungkan jenis dan ukuran

Contoh berikut membatasi hasil ke file biasa di bawah /var dengan ukuran lebih besar dari 100 MiB, yaitu 100 × 1.048.576 byte. MiB berarti mebibyte. Pada GNU find, sufiks M memakai satuan ini, bukan jutaan byte desimal. Pengujian -size memakai ukuran logis file, bukan jumlah blok disk yang dialokasikan, dan membulatkan ke atas ke satuan yang dipilih.

find /var -type f -size +100M

Tanda + berarti lebih besar, tanda - berarti lebih kecil, dan tanpa tanda berarti tepat dalam satuan yang sudah dibulatkan. Misalnya, -size 1M bukan berarti tepat 1 MiB: ukuran positif sampai 1 MiB dapat masuk ke satuan pertama. Gunakan sufiks c untuk perbandingan byte. Jika /var tidak ada atau sebagian tidak dapat diakses, periksa pesan kesalahan; hasil yang terlihat belum tentu mencakup seluruh cakupan.

Cari berdasarkan waktu perubahan

Jika /srv/app memang ada, contoh berikut mencari file biasa yang data isinya diubah dalam rentang kurang dari 60 menit. Ini bukan waktu pembuatan file. Gunakan -mmin untuk rentang menit dan -mtime untuk periode 24 jam yang telah berlalu; -mtime tidak sekadar membandingkan tanggal kalender.

find /srv/app -type f -mmin -60

Untuk -mtime, pecahan periode 24 jam diabaikan. -mtime 1 mencakup umur perubahan dari 24 sampai kurang dari 48 jam, sedangkan -mtime +30 memerlukan lebih dari 30 periode bulat, yaitu setidaknya 31 periode 24 jam. Periksa jam sistem dan waktu perubahan file bila hasil berbeda dari yang diharapkan.

Periksa cakupan dengan contoh lengkap

Di direktori latihan milik Anda, pastikan demo-find belum ada agar hasil tidak tercampur dengan data lain. Rangkaian berikut membuat direktori dan file kosong, lalu mencari akhiran .txt. Penghubung && memastikan langkah berikutnya hanya berjalan jika langkah sebelumnya berhasil.

mkdir demo-find &&
touch demo-find/a.txt &&
find demo-find -name '*.txt'

Dengan direktori latihan baru tersebut, hasilnya adalah:

demo-find/a.txt

Jalur hasil mencakup titik awal yang digunakan. Urutan hasil pada pohon yang memiliki banyak file tidak dijamin terurut. Pencarian ini tidak memerlukan penghapusan data apa pun; Anda dapat membiarkan direktori latihan tetap ada setelah memeriksa hasil.

Opsi, pengujian, dan tindakan utama

Bentuk Kegunaan
-name POLA Cocokkan pola nama terakhir dengan membedakan huruf besar/kecil.
-iname POLA Cocokkan nama tanpa membedakan huruf besar/kecil.
-type JENIS Pilih file biasa (f), direktori (d), tautan simbolis (l), atau jenis lain.
-maxdepth N Batasi kedalaman; titik awal adalah kedalaman 0.
-mtime N Uji umur perubahan isi dalam periode 24 jam.
-size N Uji ukuran file dengan satuan dan aturan pembulatan yang dipilih.
-exec PERINTAH {} + Berikan beberapa jalur yang cocok sebagai argumen terpisah ke perintah.
-delete Hapus entri yang cocok; tindakan langsung ini juga mengaktifkan -depth.

POLA, JENIS, N, dan PERINTAH adalah penanda yang diganti sesuai kebutuhan. Letakkan opsi pembatas penelusuran setelah jalur awal, misalnya find . -maxdepth 1 -type f -print. Kedalaman 1 mencakup anak langsung, sedangkan -maxdepth 0 hanya menguji titik awal. Ini berbeda dari membatasi jumlah hasil yang ditampilkan.

Contoh praktis

Temukan direktori kosong

Jalankan contoh berikut dari direktori latihan yang sudah dipilih. -empty dapat cocok dengan file biasa kosong maupun direktori kosong, sehingga -type d diperlukan untuk memilih direktori saja. Tindakan -print hanya menampilkan jalurnya. Direktori saat ini juga dapat menjadi hasil bila memang kosong.

find . -type d -empty -print

Berikan hasil sebagai argumen perintah

Contoh berikut menampilkan rincian file latihan berakhiran .tmp dengan ls. Find mengganti {} dengan jalur terpilih dan memakai + untuk mengelompokkan beberapa jalur dalam satu atau beberapa pemanggilan. Jalur menjadi argumen terpisah, sehingga spasi dalam nama tidak memecahnya. Pada bentuk ini, satu pasangan {} harus berada tepat sebelum +. -- pada ls menandai akhir opsi.

find . -type f -name '*.tmp' -exec ls -l -- {} +

Ini menghindari pemecahan nama seperti pada pengolahan keluaran teks biasa, tetapi bukan jaminan bahwa data tidak berubah di antara pencarian dan tindakan. Tampilan ls juga dapat memberi kutip pada karakter khusus. Jangan mengubah contoh menjadi penyisipan nama file ke teks perintah shell; gunakan argumen terpisah. Untuk direktori yang dapat diubah pihak lain, baca pertimbangan keamanan -exec dan -execdir pada manual sebelum merancang tindakan pengubahan data.

Tinjau target sebelum menghapus

Gunakan ./cache hanya jika itu direktori yang sengaja dipilih untuk latihan atau pemeliharaan, dan pastikan jalur absolutnya, kepemilikan data, serta cadangannya sudah benar. Jalankan pencarian -print terlebih dahulu dan periksa semua hasil. Pada contoh ini, file biasa dipilih berdasarkan waktu perubahan setidaknya 31 periode 24 jam, bukan sekadar lebih dari 30 tanggal kalender.

find ./cache -depth -type f -mtime +30 -print
# Jalankan hanya setelah target dan cadangan diperiksa:
# find ./cache -depth -type f -mtime +30 -delete

Baris yang diawali # di atas adalah komentar, sehingga menyalin blok tidak langsung menghapus file. Hanya setelah hasil dan cakupan benar, jalankan perintah penghapusan yang dicontohkan pada komentar secara terpisah. -delete bekerja tanpa konfirmasi dan tidak memindahkan file ke tempat sampah. Tidak ada perintah undo bawaan; pemulihan bergantung pada cadangan atau fasilitas penyimpanan Anda.

Opsi -depth memproses isi direktori sebelum direktori itu sendiri. -delete mengaktifkannya secara implisit; menuliskan -depth pada tahap pratinjau menyamakan cara penelusuran. Jangan mencampurkan -delete dengan -prune untuk mengecualikan cabang, karena -depth membuat -prune tidak efektif. Dua proses pencarian tetap bukan transaksi atomik: isi pohon dapat berubah sesudah ditinjau.

Perbandingan dengan perintah lain

Perintah Fungsi utama Penggunaan yang sesuai
find Menelusuri pohon direktori saat dijalankan Kondisi metadata dan tindakan terperinci
locate (bahasa Inggris) Mencari dalam indeks nama file Pencarian nama tanpa menelusuri seluruh pohon saat itu
which Mencari program eksternal melalui PATH Menemukan lokasi berkas program
grep -R Mencari pola dalam isi file Menemukan teks, bukan hanya nama file

PATH adalah daftar direktori tempat shell mencari program eksternal. Indeks locate dapat tertinggal dari perubahan terbaru, sedangkan find membaca keadaan yang ditemui selama penelusuran. Kecepatan keduanya bergantung pada cakupan dan sistem; tidak ada urutan kecepatan yang berlaku untuk setiap pencarian. Referensi perintah Linux berdasarkan tugas (bahasa Inggris) membantu memilih alat untuk kebutuhan lain.

Hal yang perlu diperhatikan

Lindungi pola dari ekspansi shell

Tanpa kutip, shell dapat mengganti *.log dengan nama yang ada di direktori saat ini sebelum find berjalan. Hasilnya bisa menjadi pola yang terlalu sempit atau kesalahan jumlah argumen. Pola -name bukan ekspresi reguler: *.log berarti pola nama dengan akhiran itu. Untuk membandingkan seluruh jalur, pilih pengujian seperti -path.

Periksa tautan dan batas sistem berkas

GNU find secara bawaan memakai perilaku -P, yaitu tidak mengikuti tautan simbolis; tautan tetap dapat menjadi entri hasil. Opsi -L memperluas penelusuran ke target tautan dan dapat mengubah makna -type. Jangan menambahkannya begitu saja pada pencarian yang akan menghapus data. Titik mount juga dapat memperluas cakupan; -xdev membatasi penurunan ke sistem berkas lain, tetapi bukan pengganti pemeriksaan jalur dan titik mount yang sebenarnya.

Kelompokkan AND dan OR secara eksplisit

AND mempunyai prioritas lebih tinggi daripada OR. Untuk memilih file biasa berakhiran .log atau .txt, gunakan bentuk find . -type f \( -name '*.log' -o -name '*.txt' \) -print. Garis miring terbalik melindungi tanda kurung dari shell. Tanpa pengelompokan, -type f atau tindakan -print dapat hanya berlaku pada salah satu cabang, sehingga hasil berbeda dari yang dimaksud.

FAQ

Apakah find mencari sampai subdirektori?

Ya, secara bawaan di bawah setiap titik awal. Opsi kedalaman, batas sistem berkas, tautan, dan izin akses dapat membatasi bagian yang benar-benar ditelusuri.

Bagaimana cara mengabaikan huruf besar/kecil pada nama?

Pada GNU find, gunakan -iname dan tetap kutip polanya, misalnya -iname '*.log'.

Bagaimana cara menangani nama yang mengandung spasi?

Gunakan -exec PERINTAH {} + dengan argumen terpisah. Alternatifnya adalah -print0 dengan alat penerima yang mendukung pemisah NUL, yaitu byte bernilai nol. Keluaran biasa yang dipisahkan baris baru tidak cukup untuk semua nama file.

Mengapa locate kadang lebih cepat?

Locate dapat menjawab dari indeks yang sudah dibuat, sementara find perlu memeriksa pohon yang dipilih. Imbalannya, indeks tidak selalu mencerminkan perubahan terbaru; hasil dan kecepatan bergantung pada cakupan serta keadaan sistem.

Dokumentasi