Perintah find memungkinkan pengguna untuk mencari file dan mengambil tindakan terhadapnya. Ini adalah bagian dari paket "findutils" dan dibundel dengan semua distribusi. Ini sangat fleksibel, memungkinkan Anda untuk mencari file dan direktori berdasarkan berbagai kondisi. Opsional, ini juga memungkinkan Anda untuk mengambil berbagai jenis tindakan pada hasil.
Pada artikel ini, kita akan memahami cara bekerja dengan perintah find. Kami juga akan mengilustrasikan penggunaannya melalui berbagai contoh di seluruh artikel ini.
Pengantar
Struktur dasar dari perintah find adalah seperti ini:
find [paths] [expression] [actions]
Perintah find mengambil sejumlah jalur, dan mencari file dan direktori di setiap jalur "secara rekursif". Jadi, ketika perintah find menemukan direktori di dalam jalur yang diberikan, ia mencari file dan direktori lain di dalamnya. Sekali lagi, jika ada direktori lain di dalamnya, perintah find juga akan melihat ke dalamnya. Proses ini berlanjut hingga pencarian semua item di dalam jalur yang Anda tentukan.
Secara default, perintah find menemukan semua yang ada di dalam direktori. Jika Anda ingin memfilter beberapa di antaranya berdasarkan kriteria tertentu, Anda dapat menentukan ekspresi untuk melakukannya.
Tindakan default adalah mencetak semua hasil. Namun, Anda juga dapat menentukan tindakan khusus yang dapat dilakukan perintah find pada hasil.
Konsep-konsep ini akan menjadi lebih jelas saat kita membahas berbagai contoh yang disebutkan nanti dalam artikel ini.
Menemukan semua file dan direktori
Bayangkan Anda ingin membuat daftar semua direktori dan file untuk jalur tertentu. Misalnya, jika Anda ingin mencantumkan konten /usr/share
direktori, jalankan:
find /usr/share
Ini akan memberi Anda daftar file dan direktori, seperti yang ditunjukkan pada gambar di bawah. Tergantung pada isi direktori, daftar ini bisa sangat besar!
Jika Anda ingin membuat daftar isi dari beberapa direktori, Anda dapat melakukannya seperti ini:
find /usr/share /bin /usr/lib
Jika Anda ingin membuat daftar isi direktori kerja saat ini, gunakan titik (.
) sebagai jalur:
find .
Ketika tidak ada jalur, perintah find mengasumsikan bahwa itu harus bekerja dengan direktori saat ini. Jadi, Anda dapat meninggalkan .
dan cukup gunakan:
find
Menemukan item berdasarkan namanya
Seperti yang kami sebutkan sebelumnya, Anda dapat memfilter hasil dari perintah find menggunakan ekspresi. Di bagian ini, kita akan mempelajari cara memfilter item berdasarkan namanya.
Jika Anda ingin mencari file atau direktori bernama NEWS.txt
di dalam /usr
direktori, gunakan -name
beralih seperti ini:
find /usr -name NEWS.txt
-name
sakelar peka huruf besar-kecil. Jika Anda tidak tahu persis kasus barang yang Anda cari, Anda dapat menggunakan -iname
sakelar yang tidak peka huruf besar/kecil:
find /usr -iname news.txt
-name
dan -iname
switch juga menerima "wildcard", yang merupakan karakter khusus yang bertindak sebagai pengganti. Ada dua karakter pengganti — ?
karakter mewakili satu karakter yang tidak diketahui, dan *
karakter mewakili sejumlah karakter yang tidak diketahui (termasuk nol).
Jika Anda ingin menggunakan karakter wildcard, Anda harus menyimpan name
/iname
parameter di dalam tanda kutip tunggal atau ganda. Sejak *
dan ?
karakter juga merupakan karakter khusus untuk shell, menempatkannya dalam tanda kutip memastikan bahwa perintah bekerja dengan benar.
Sebagai contoh, jika Anda harus mencari semua file dan direktori di dalam /usr
yang memiliki .txt
di akhir namanya, Anda dapat menggunakan:
find /usr -name '*.txt'
Jika Anda ingin mencari file dan direktori dengan empat huruf di namanya, jalankan:
find /usr -name '????'
Terkadang, Anda mungkin ingin mencocokkan path lengkap ke file/direktori, daripada hanya mencocokkan namanya. Dalam situasi seperti itu, Anda dapat menggunakan -path
mengalihkan. Sebagai contoh, katakanlah Anda ingin mencari semua file dan direktori dengan .txt
di akhir nama mereka, tetapi hanya jika mereka berada di direktori bernama src
. Jadi, di path lengkap, akan ada /src/
di suatu tempat di tengah, dan .txt
pada akhirnya. Jadi, perintahnya adalah:
find /usr -path '*/src/*.txt'
Ada juga -ipath
switch, yang merupakan versi -path
yang tidak peka huruf besar-kecil .
Mencari file atau direktori
Semua contoh yang telah kita lihat sejauh ini mengembalikan file dan direktori. Namun, jika Anda hanya perlu mencari file atau direktori, Anda dapat menggunakan -type
mengalihkan. Parameter paling umum dari -type
adalah:
-
f
:file -
d
:direktori -
l
: tautan simbolik
Misalnya, untuk menemukan semua file di /usr
direktori, jalankan:
find /usr -type f
Anda juga dapat menggabungkan berbagai sakelar dari perintah find. Misalnya, untuk menemukan semua .txt
file di /usr
direktori, Anda dapat menggunakan:
find /usr -type f -name '*.txt'
Demikian pula, untuk menemukan direktori di dalam /usr
yang dimulai dengan "python", gunakan:
find /usr -type d -name 'python*'
Menemukan file kosong
Perintah find mendukung -empty
flag untuk mencari file dan direktori yang kosong. File kosong adalah file yang tidak memiliki konten di dalamnya, sedangkan direktori kosong adalah file yang tidak memiliki file atau subdirektori di dalamnya.
Misalnya, jika Anda ingin menemukan daftar direktori kosong di direktori home Anda, Anda dapat menjalankan:
find ~ -type d -empty
Meniadakan kecocokan
Perintah find juga memungkinkan Anda untuk "meniadakan" kecocokan. Ini berguna ketika kami memiliki kriteria untuk dikecualikan dari pencarian kami.
Sebagai contoh, katakan Anda ingin mencari file di /usr
direktori yang tidak memiliki .txt
perpanjangan. Anda dapat meniadakan -name
beralih dengan menambahkan tanda seru (!
) di depannya, seperti yang ditunjukkan:
find /usr -type f ! -name '*.txt'
Anda juga dapat membalikkan sakelar lainnya. Jadi, jika Anda ingin menemukan direktori yang tidak kosong di direktori home Anda, jalankan:
find /usr -type f ! -empty
Menelusuri berdasarkan kepemilikan
Perintah find mendukung pencarian file dan direktori berdasarkan informasi kepemilikannya.
Untuk menemukan file atau direktori milik pengguna tertentu, Anda dapat menggunakan -user
mengalihkan. Misalnya, jika Anda ingin menemukan semua file di sistem milik pengguna booleanworld
, jalankan:
find / -type f -user booleanworld
Anda juga dapat menggunakan ID pengguna pada perintah di atas, sebagai ganti nama pengguna. Anda dapat mencari ID pengguna dengan perintah berikut:
id -u <username>
Demikian juga, -group
switch memungkinkan Anda untuk mencari file dan direktori milik grup tertentu. Itu juga dapat menerima nama grup, atau ID grup. Anda dapat melihat ID grup pengguna dengan perintah berikut:
id -g <username>
Mencari file berdasarkan tanggal dan waktu
Terkadang, Anda mungkin perlu mencari file tergantung kapan file tersebut diakses atau dimodifikasi. Pada sistem Linux, ada tiga jenis "waktu" yang terkait dengan file:
- Waktu modifikasi :Terakhir kali konten file diubah.
- Waktu akses :Terakhir kali file dibaca.
- Ubah waktu :Terakhir kali file (baik konten atau metadatanya, seperti izin) diubah.
Untuk menemukan file berdasarkan modifikasi, akses, atau perubahan waktu, perintah find memiliki -mtime
, -atime
dan -ctime
switch. Sakelar ini memungkinkan Anda memfilter file berdasarkan jumlah hari. Di sini, "hari" mengacu pada periode 24 jam.
Mari kita pahami cara menggunakan flag-flag ini. Sebagai contoh, jika Anda menggunakan -mtime
, maka:
-
-mtime 2
:File telah diubah 2 hari yang lalu (yaitu dalam 48 hingga 72 jam terakhir). -
-mtime -2
:File diubah kurang dari 2 hari yang lalu (yaitu dalam 48 jam terakhir). -
-mtime +2
:File telah diubah lebih dari 2 hari yang lalu (yaitu 3 hari atau lebih, yang berarti 72 jam atau lebih).
Jadi, untuk menemukan file di /usr
yang diubah dua hari lalu, jalankan:
find /usr -type f -mtime 2
-atime
dan -ctime
sakelar bekerja persis dengan cara yang sama seperti -mtime
.
Jika Anda merasa bahwa satu hari terlalu lama, Anda juga dapat menggunakan -mmin
, -amin
atau -cmin
untuk menyaring dalam hitungan menit. Jadi, -amin +5
berarti file yang diakses lebih dari 5 menit yang lalu, -amin -5
berarti file telah diubah kurang dari 5 menit yang lalu, dan seterusnya.
Anda dapat menggunakan banyak dari bendera ini sekaligus. Jika Anda ingin menemukan file yang dimodifikasi 2 hari yang lalu dan diakses 5 menit yang lalu, jalankan:
find /usr -type f -mtime 2 -amin 5
Anda bahkan dapat mengulangi bendera yang sama! Sebagai contoh, Anda ingin mencari file yang dimodifikasi antara 50 dan 100 hari yang lalu, gunakan:
find /usr -type f -mtime +50 -mtime -100
Mencari berdasarkan ukuran
Perintah find memiliki -size
beralih untuk memungkinkan pengguna menemukan file berdasarkan ukurannya. Karena hanya file yang dapat memiliki ukuran file, saat Anda menggunakan sakelar ini, tidak ada direktori yang akan dicantumkan.
Untuk menentukan ukuran file, kami menempatkan angka diikuti dengan huruf untuk mewakili unit. Anda dapat menggunakan huruf berikut:
-
c
:byte -
k
:kilobyte -
M
:megabyte -
G
:gigabyte
Selain itu, Anda dapat menggunakan +
atau -
untuk memaksakan kondisi “lebih besar dari” atau “kurang dari”.
Mari kita pahami ini dengan beberapa contoh. Jika Anda ingin membuat daftar semua file pada sistem dengan ukuran 10 KB, gunakan:
find / -size 10k
Untuk menemukan file yang berukuran lebih dari 1 GB, gunakan:
find / -size +1G
Demikian pula, untuk menemukan file yang berukuran kurang dari 10 MB, gunakan:
find / -size -10M
Menelusuri berdasarkan izin
Perintah find mendukung -perm
beralih untuk mengizinkan pencarian berdasarkan izin. Ini memungkinkan Anda untuk mencari berdasarkan mode numerik dan simbolik. Jika Anda tidak terbiasa dengan izin, Anda dapat menemukan ikhtisar di sini.
Menggunakan izin simbolis
Mari kita mulai dengan contoh sederhana. Misalkan, Anda ingin mencari semua file dan direktori di /usr
direktori dengan izin rwxr-xr-x
. Untuk melakukannya, jalankan:
find /usr -perm u=rwx,g=rx,o=rx
Huruf u
, g
dan o
singkatan dari "pengguna", "grup" dan "pemilik".
Anda juga dapat menggunakan huruf a
untuk memeriksa izin yang berlaku untuk semua pengguna. Misalnya, untuk menemukan semua file dan direktori pada sistem dengan izin r-xr-xr-x
, jalankan:
find /usr -perm a=rx
Seringkali, kami tertarik untuk mencocokkan subset dari izin. Misalnya, Anda mungkin ingin mencari file pada sistem yang dapat dijalankan oleh semua pengguna. Dalam hal ini, kami hanya peduli bahwa bit eksekusi diatur untuk ketiga kelas izin. Namun, sisa bit mungkin disetel atau tidak disetel.
Karena semua kelas izin harus memiliki bit eksekusi, kami menulis izin sebagai a=x
. Kemudian, kita tambahkan /
di depan untuk menunjukkan bahwa kami bermaksud mencocokkan subset izin. Jadi, perintahnya adalah:
find / -type f -perm /a=x
Menggunakan izin numerik
Mari kita perhatikan contoh pertama di bagian sebelumnya. Ini cukup mudah — rwxr-xr-x
adalah 644 dalam mode numerik, jadi Anda cukup menjalankan:
find /usr -perm 644
Memeriksa subset izin sedikit lebih rumit. Seperti yang kami sebutkan sebelumnya, mencari file yang dapat dieksekusi semua orang melibatkan pemeriksaan apakah bit eksekusi telah diatur. Kami tidak peduli dengan bagian lainnya. Untuk setiap bit yang harus kita periksa, kita beri 1, dan sisanya kita beri 0. Dengan proses ini, kita memperoleh bilangan biner dan kita mengubahnya menjadi oktal seperti yang ditunjukkan:
Selanjutnya, kita tambahkan -
di depan nomor ini untuk menunjukkan bahwa kami bermaksud mencocokkan subset izin. Jadi, perintahnya adalah:
find / -type f -perm -111
Mencari berdasarkan tanda hak akses
Sekarang, katakanlah Anda tertarik untuk mencari berdasarkan flag hak numerik. Untuk tujuan ini, Anda dapat menggunakan mode numerik atau simbolik.
Sebagai contoh, katakanlah Anda tertarik untuk menemukan semua file di sistem Anda dengan set bit setuid. Kami dapat memperluas apa yang kami pelajari tentang mode numerik ke situasi ini. Dalam hal ini, kita hanya peduli dengan flag setuid, yang memiliki nilai 4. Namun, kita tidak peduli dengan bit izin apa pun, yang berarti kita mendapatkan 000. Dengan demikian, kita dapat mencari file-file ini menggunakan:
find / -type f -perm -4000
Tentu saja, Anda juga dapat memfilter bit izin. Jika Anda tertarik dengan file yang dapat dijalankan semua pengguna, dan juga memiliki setuid bit, ganti 4000 dengan 4111 pada perintah di atas. (Kami sebelumnya telah melihat bagaimana kami mendapatkan nilai 111.)
Demikian pula, Anda dapat menggunakan 2000 untuk bit setgid dan 1000 untuk bit lengket. Jika Anda ingin menguji kombinasi bit-bit ini, tambahkan nilainya. Misalnya, untuk menguji bit setuid dan sticky, Anda akan menggunakan 5000 (=4000 + 1000).
Jika Anda ingin melakukan hal yang sama dengan mode simbolik, Anda dapat menggunakan:
find / -type f -perm /u=s
Untuk bit setgid, gunakan /g=s
, dan untuk sticky bit gunakan /o=t
. Untuk menguji kombinasi bit ini, pisahkan dengan koma, seperti /u=s,o=t
.
Membatasi kedalaman traversal
Seperti yang kami sebutkan sebelumnya, perintah find mencari item secara rekursif. Namun, hasil yang diperoleh mungkin sangat besar, dan Anda mungkin ingin menetapkan batas seberapa dalam perintah find dapat mencari. Ini dapat dilakukan dengan -maxdepth
beralih.
Jika Anda menjalankan perintah berikut, Anda akan melihat bahwa semua item yang ditampilkan tidak lebih dari tiga level:
find / -maxdepth 3
Dalam situasi lain, Anda mungkin ingin menetapkan batas kedalaman minimum. Perintah find juga mendukung -mindepth
beralih untuk tujuan ini. Jadi, jika Anda menjalankan:
find / -mindepth 3
Operasi logis dalam perintah find
Di bagian sebelumnya, kita telah melihat flag yang didukung oleh perintah find. Kami juga telah melihat bagaimana kami dapat menggabungkan berbagai bendera dan meniadakannya. Dalam beberapa situasi, kita membutuhkan konstruksi yang lebih kuat.
Perintah find mendukung kondisi “dan” dan “atau” dengan -a
dan -o
switch. Ini juga mendukung pengelompokan bagian dari ekspresi dengan tanda kurung ()
. Namun, karena tanda kurung juga merupakan karakter khusus untuk shell, Anda harus menempatkannya dalam tanda kutip tunggal atau ganda. Selain itu, saat Anda menentukan beberapa bendera satu demi satu, perintah find secara otomatis mengasumsikan "dan".
Mari kita perhatikan contoh yang kita lihat sebelumnya — menemukan direktori di dalam /usr
yang dimulai dengan "python". Di sana, kami menggunakan perintah:
find /usr -type d -name 'python*'
Anda juga dapat menulis “dan” secara eksplisit seperti ini:
find /usr -type d -a -name 'python*'
Sekarang, mari kita pertimbangkan contoh yang berbeda. Misalkan, Anda ingin mencari file/direktori pada sistem yang dimodifikasi dalam 5 menit terakhir atau lebih awal dari 50 hari. Untuk perintah ini, kita akan menggunakan operator “atau” seperti ini:
find / -mmin -5 -o -mtime +50
Selanjutnya, misalkan kita memberlakukan batasan tambahan untuk masalah di atas — Anda ingin mencari file saja. Pertama, kami akan menjaga kondisi untuk memfilter file yang dimodifikasi dalam grup. Kemudian, kami akan "dan" dengan kondisi untuk menemukan file. Jadi, perintah terakhirnya adalah:
find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
Sejak -a
implisit, Anda juga dapat mengabaikannya dari perintah di atas.
Mengambil tindakan
Sejauh ini, semua perintah find mencetak hasilnya di terminal. Biasanya, kami ingin melakukan beberapa tindakan dengan hasil ini, seperti menyalin atau menghapus item ini. Untungnya, perintah find juga mendukung pengambilan "tindakan" pada hasil ini.
Tindakan default adalah mencetak semua hasil; Anda dapat memverifikasi ini dengan menambahkan -print
beralih di akhir perintah find apa pun. Ada banyak tindakan lain juga. Kami akan melihat beberapa yang paling berguna di bawah ini.
Menghapus file
Untuk menghapus file atau direktori, gunakan -delete
tindakan. Ia bekerja dengan file dan direktori. Misalnya, jika Anda ingin menghapus semua direktori kosong dari direktori home, jalankan:
find ~ -type d -empty -delete
Melaksanakan perintah
Perintah find juga mendukung eksekusi perintah khusus dengan -exec
beralih.
Misalkan, Anda ingin mencadangkan semua audio MP3 Anda dari direktori home ke hard drive eksternal Anda. Asumsikan bahwa hard drive eksternal tersedia di /media/MyDrive
. Untuk menyalin satu file, Anda akan menggunakan:
cp <path to file> /media/MyDrive
Untuk menyalin semua file, Anda dapat menggunakan perintah berikut.
find ~ -type f -name '*.mp3' -exec cp {} ';'
Di sini, sepasang kurung kurawal ({}
) bertindak sebagai pengganti untuk jalur ke file. Untuk memberi tahu perintah file di mana perintah berakhir, kami menggunakan titik koma(;
). Namun, karena ini juga merupakan karakter khusus untuk shell, kami membungkusnya dengan tanda kutip tunggal.
Setiap kali perintah find menemukan file yang cocok dengan kondisi, ia mengganti kurung kurawal dengan jalur sebenarnya, dan menjalankan perintah. Jadi, cp
perintah dijalankan untuk setiap file MP3.
Mari kita lihat kegunaan penting lainnya — menemukan string di banyak file. Untuk menemukan string "halo" dalam file, kami menggunakan grep seperti ini:
grep hello <file name>
Jika Anda sudah familiar dengan grep
, Anda mungkin tergoda untuk menulis perintah seperti ini:
find ~ -type f -exec grep hello {} ';'
Namun, jika Anda menggunakan perintah ini, Anda akan segera memahami masalahnya. Kami ingin daftar file dengan string "halo"; namun kami mendapatkan daftar baris yang cocok. Untungnya, grep
memiliki -l
switch, yang membuatnya mencetak jalur file jika ada kecocokan. Jadi, perintahnya adalah:
find ~ -type f -exec grep -l hello {} ';'
Melaksanakan perintah:varian yang berbeda
Misalkan, Anda ingin membuat file terkompresi. Untuk membuat file terkompresi Gzip dengan nama music.tar.gz
, Anda akan menjalankan:
tar -czf music.tar.gz <list of files>
Sekarang, misalkan Anda ingin mengompres semua file MP3 di direktori home Anda, ke satu file terkompresi. Mungkin Anda akan menemukan yang berikut ini:
find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} ';'
Namun, jika Anda membuka music.tar.gz
file, Anda akan melihat bahwa hanya ada satu file MP3. Ingat bahwa find
mengeksekusi perintah setiap kali menemukan file baru. Jadi, file sebelumnya selalu ditimpa dengan arsip baru; dan kami tidak ingin itu terjadi.
Semua masalah kita bisa diselesaikan jika ada cara untuk memberitahu find
untuk meneruskan daftar file ke tar
, setelah menemukan semua file. Di sinilah varian kedua dari -exec
switch masuk. Alih-alih mengakhiri perintah dengan ;
, kami menggunakan +
seperti ini:
find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} +
Mengeksekusi perintah pada direktori
Terkadang, berguna untuk menjalankan perintah pada direktori di mana file/direktori berada. Perintah find memiliki -execdir
beralih yang melakukan ini. Ini mirip dengan -exec
dalam semua cara lain, dan bahkan memiliki +
dan ;
varian.
Melihat informasi file
Jika Anda ingin melihat informasi tentang file/direktori (seperti izin dan ukuran), Anda dapat menggunakan -ls
mengalihkan. Misalnya, jika Anda ingin melihat detail tentang file di sistem yang lebih besar dari 1 GB, jalankan:
find / -type f -size +1G -ls
Menghapus pesan kesalahan
Saat mencoba beberapa perintah find, Anda mungkin mendapatkan beberapa kesalahan seperti "Izin ditolak". Anda dapat menyembunyikan pesan kesalahan ini dengan mengarahkannya ke /dev/null
, seperti yang ditunjukkan:
find [paths] [expression] [actions] 2>/dev/null
Kesimpulan
Dalam artikel ini, kita telah melihat cara menggunakan perintah find, bersama dengan contoh yang mencakup sebagian besar kasus penggunaan. Jika Anda ingin membaca lebih lanjut, Anda dapat membaca halaman manual dengan mengetik man find
di terminal Anda.