Perintah find Linux: cara menemukan file dan direktori

Perintah find di Linux menelusuri direktori yang ditentukan dan sub-itemnya untuk menemukan file atau direktori yang cocok dengan kondisi seperti nama, jenis, atau ukuran. Tentukan lokasi pencarian dan kondisinya bersama-sama, dan tempatkan pola nama file dalam tanda kutip agar shell tidak memperluasnya terlebih dahulu.

Format dasar dan ruang lingkup pencarian

Dalam format berikut, jalur awal adalah tempat pencarian dimulai, dan kondisi membatasi apa yang harus ditemukan. Jalur itu sendiri juga termasuk dalam target pencarian. Contoh di bawah ini didasarkan pada GNU findutils find dan Bash.

find PATH EXPRESSION

find . menelusuri direktori saat ini dan subdirektori, dan find /etc dimulai dari /etc. Jika tidak ada kondisi yang ditentukan, itu mencetak jalur dan juga menelusuri file tersembunyi serta direktori tersembunyi. Direktori tanpa izin mungkin menampilkan kesalahan akses, dan isinya tidak akan dicari.

Latihan berikutnya membuat file dalam direktori sementara baru. Anda perlu melanjutkan di terminal yang sama untuk mempertahankan variabel workdir. Setelah mencetak jalur untuk memeriksa lokasi, jalankan contohnya.

workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"

Cari berdasarkan nama dan tipe berkas

-name cocok dengan sensitivitas huruf terhadap komponen jalur terakhir, bukan jalur penuh. -iname tidak membedakan huruf besar atau kecil. Tanda kutip tunggal mencegah shell memperluas * sebelum meneruskan pola tersebut ke find.

find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'

Perintah pertama mencari app.conf dan .hidden.conf, dan perintah kedua juga menemukan EXTRA.CONF. Urutan keluaran dapat bervariasi tergantung pada lingkungan. Mengetik find /etc *.conf tidak memiliki kondisi nama dan dapat bertindak tanpa sengaja tergantung pada perluasan shell, jadi hindari. Sebagai gantinya, gunakan find /etc -name '*.conf'.

-type f mencari berkas biasa, -type d mencari direktori. Jika kondisi digabungkan, semuanya harus dipenuhi.

find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'

Perintah pertama hanya menampilkan file biasa dengan ekstensi yang sesuai, perintah kedua hanya menampilkan direktori yang bernama docs. Secara default, GNU find tidak mengikuti tautan simbolik ke subdirektori. Untuk mencari tautan itu sendiri, gunakan -type l.

Menyempitkan jangkauan berdasarkan kedalaman dan item kosong

-maxdepth 1 hanya mencari sampai jalur awal dan item yang langsung berada di bawahnya. Untuk mengecualikan jalur awal dari hasil, tentukan -mindepth 1 juga. Disarankan untuk menempatkan kedua opsi sebelum kondisi dalam GNU find.

find "$workdir" -mindepth 1 -maxdepth 1 -type d

Dalam praktiknya, docs dan empty-dir segera di bawahnya akan ditampilkan. -empty menemukan file biasa kosong dan direktori kosong, sehingga Anda dapat membedakan dengan menentukan tipe yang Anda inginkan.

find "$workdir" -type f -empty
find "$workdir" -type d -empty

File yang dibuat dengan touch dalam latihan semuanya kosong. Pada perintah kedua, empty-dir muncul. Jangan langsung menganggap hasil pencarian sebagai target untuk dihapus; pertama, periksa path dan kondisinya.

Menjalankan perintah pada file yang ditemukan

-exec menjalankan perintah pada item yang cocok. Contoh berikut mengeluarkan jumlah byte dari file biasa tanpa menghapusnya. {} diganti dengan jalur yang ditemukan, dan + mengelompokkan beberapa path sebanyak mungkin untuk diteruskan ke perintah.

find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +

Karena file latihan kosong, jumlah byte untuk setiap file ditampilkan sebagai 0. wc juga dapat menampilkan total jika beberapa file diterima. Bahkan jika ada spasi dalam nama file, setiap jalur diteruskan sebagai argumen terpisah. Untuk menjalankan perintah untuk setiap item secara terpisah, Anda dapat menggunakan \; alih-alih +.

Sebelum menggabungkan perintah hapus atau ubah, pertama keluarkan hanya jalur di bawah kondisi yang sama dan periksa target serta cadangannya. Di direktori di mana pengguna lain mungkin mengubah file selama pencarian, target dapat berubah bahkan setelah diperiksa, jadi kehati-hatian ekstra diperlukan. Untuk detail lebih lanjut, lihat Pertimbangan keamanan GNU find.

Ketika hasilnya berbeda dari yang diharapkan

Jika tidak ada hasil, periksa jalur awal, huruf besar/kecil dalam nama, ekstensi, dan jenis file secara berurutan. Juga, periksa apakah pola dikutip, dan apakah diperlukan jalur lengkap alih-alih -name. Saat mencari berdasarkan jalur lengkap, Anda bisa menggunakan -path.

Jika terjadi kesalahan izin, itu berarti ada area yang tidak bisa dicari. Periksa izin akses yang diperlukan, dan saat menggunakan hak istimewa administrator, batasi dengan hati-hati jangkauan pencarian dan tindakan yang akan dijalankan. Makna rinci dari pola nama dan opsi dapat ditemukan di Penjelasan pola nama GNU find.